Python 에서 C++프로그램 을 호출 하 는 방법 에 대한 상세 한 설명
Python 의 장점 은 개발 효율 이 높 고 사용 이 편리 하 며 C++는 운영 효율 이 높다 는 것 을 잘 알 고 있 습 니 다.이 두 가 지 는 서로 보완 할 수 있 습 니 다.Python 프로젝트 에 C+코드 를 삽입 하거나 C+프로젝트 에서 Python 으로 외곽 기능 을 실현 하 더 라 도 Python 호출 C+모듈 의 수 요 를 만 날 수 있 습 니 다.다음은 집중 c+코드 를 Python 인터페이스 로 내 보 내 는 몇 가지 기본 적 인 방법 을 열거 합 니 다.같이 공부 합 시다.
원생 태 도 출
파 이 썬 해석 기 는 C 로 이 루어 지기 때문에 우리 의 C++데이터 구조 가 파 이 썬 에 게 인식 되 기만 한다 면 이론 적 으로 직접 호출 될 수 있다.우 리 는 test 1.cpp 를 다음 과 같이 실현 합 니 다.
#include <Python.h>
int Add(int x, int y)
{
return x + y;
}
int Del(int x, int y)
{
return x - y;
}
PyObject* WrappAdd(PyObject* self, PyObject* args)
{
int x, y;
if (!PyArg_ParseTuple(args, "ii", &x, &y))
{
return NULL;
}
return Py_BuildValue("i", Add(x, y));
}
PyObject* WrappDel(PyObject* self, PyObject* args)
{
int x, y;
if (!PyArg_ParseTuple(args, "ii", &x, &y))
{
return NULL;
}
return Py_BuildValue("i", Del(x, y));
}
static PyMethodDef test_methods[] = {
{"Add", WrappAdd, METH_VARARGS, "something"},
{"Del", WrappDel, METH_VARARGS, "something"},
{NULL, NULL}
};
extern "C"
void inittest1()
{
Py_InitModule("test1", test_methods);
}
컴 파일 명령 은 다음 과 같다.
g++ -fPIC -shared test1.cpp -I/usr/include/python2.6 -o test1.so
Python 해석 기 를 실행 합 니 다.테스트 는 다음 과 같 습 니 다.
>>> import test1
>>> test1.Add(1,2)
3
여기 몇 시 주의해 야 돼 요?nm test1.so
를 통 해 함수 기 호 를 볼 수 있 습 니 다.c+filt 도 구 는 기 호 를 통 해 함수 원형 을 역 분해 할 수 있 습 니 다.우 리 는 위 와 같은 예 를 사용 하여 test 2.cpp 를 다음 과 같이 실현 합 니 다.
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace boost::python;
int Add(const int x, const int y)
{
return x + y;
}
int Del(const int x, const int y)
{
return x - y;
}
BOOST_PYTHON_MODULE(test2)
{
def("Add", Add);
def("Del", Del);
}
그 중 BOOSTPYTHON_MODULE 의 인 자 는 내 보 낼 모듈 이름 입 니 다.컴 파일 명령 은 다음 과 같다.
g++ test2.cpp -fPIC -shared -o test2.so -I/usr/include/python2.6 -I/usr/local/include -L/usr/local/lib -lboost_python
메모:컴 파일 할 때 boost 헤더 파일 과 라 이브 러 리 의 경 로 를 지정 해 야 합 니 다.여 기 는 각각/usr/local/include 와/usr/local/lib 입 니 다.혹은 setup.py 를 통 해 모듈 내 보 내기
#!/usr/bin/env python
from distutils.core import setup
from distutils.extension import Extension
setup(name="PackageName",
ext_modules=[
Extension("test2", ["test2.cpp"],
libraries = ["boost_python"])
])
Extension 의 첫 번 째 매개 변 수 는 모듈 이름 이 고 두 번 째 매개 변 수 는 파일 이름 입 니 다.다음 명령 을 실행 합 니 다.
python setup.py build
이 때 build 디 렉 터 리 를 생 성하 고 테스트 2.so 를 찾 아 같은 단계 디 렉 터 리 에 들 어가 다음 과 같이 검증 합 니 다.
>>> import test2
>>> test2.Add(1,2)
3
>>> test2.Del(1,2)
-1
내 보 내기 클래스test 3.cpp 는 다음 과 같 습 니 다.
#include <boost/python.hpp>
using namespace boost::python;
class Test
{
public:
int Add(const int x, const int y)
{
return x + y;
}
int Del(const int x, const int y)
{
return x - y;
}
};
BOOST_PYTHON_MODULE(test3)
{
class_<Test>("Test")
.def("Add", &Test::Add)
.def("Del", &Test::Del);
}
주의:BOOSTPYTHON_MODULE 의.def 사용 방법 은 Python 의 문법 과 비슷 하 다.
class_<Test>("Test").def("Add", &Test::Add);
class_<Test>("Test").def("Del", &Test::Del);
컴 파일 명령 은 다음 과 같다.
g++ test3.cpp -fPIC -shared -o test3.so -I/usr/include/python2.6 -I/usr/local/include/boost -L/usr/local/lib -lboost_python
테스트 는 다음 과 같다.
>>> import test3
>>> test = test3.Test()
>>> test.Add(1,2)
3
>>> test.Del(1,2)
-1
변 삼 함수 내 보 내기test 4.cpp 는 다음 과 같 습 니 다.
#include <boost/python.hpp>
using namespace boost::python;
class Test
{
public:
int Add(const int x, const int y, const int z = 100)
{
return x + y + z;
}
};
int Del(const int x, const int y, const int z = 100)
{
return x - y - z;
}
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(Add_member_overloads, Add, 2, 3)
BOOST_PYTHON_FUNCTION_OVERLOADS(Del_overloads, Del, 2, 3)
BOOST_PYTHON_MODULE(test4)
{
class_<Test>("Test")
.def("Add", &Test::Add, Add_member_overloads(args("x", "y", "z"), "something"));
def("Del", Del, Del_overloads(args("x", "y", "z"), "something"));
}
여기 Add 와 Del 함 수 는 모두 기본 매개 변 수 를 사 용 했 습 니 다.Del 은 일반 함수 이 고 Add 는 클래스 구성원 함수 입 니 다.여 기 는 각각 다른 매크로 를 호출 했 습 니 다.매크로 의 마지막 두 매개 변 수 는 함수 의 최소 매개 변수 개수 와 최대 매개 변수 개 수 를 대표 합 니 다.컴 파일 명령 은 다음 과 같다.
g++ test4.cpp -fPIC -shared -o test4.so -I/usr/include/python2.6 -I/usr/local/include/boost -L/usr/local/lib -lboost_python
테스트 는 다음 과 같다.
>>> import test4
>>> test = test4.Test()
>>> print test.Add(1,2)
103
>>> print test.Add(1,2,z=3)
6
>>> print test4.Del(1,2)
-1
>>> print test4.Del(1,2,z=3)
-1
Python 대상 인터페이스 내 보 내기Python 인터페이스 로 내 보 내 는 이상 호출 자 는 Python 특유 의 데이터 구 조 를 사용 할 수 밖 에 없습니다.예 를 들 어 tuple,list,dict 는 원래 의 생태 방법 이 너무 번 거 로 워 서 boost 의 사용 방법 만 기록 하고 다음 과 같은 Python 함수 기능 을 실현 한다 고 가정 합 니 다.
def Square(list_a)
{
return [x * x for x in list_a]
}
들 어 오 는 list 요소 마다 제곱 을 계산 하여 list 형식의 결 과 를 되 돌려 주 는 것 입 니 다.코드 는 다음 과 같다.
#include <boost/python.hpp>
boost::python::list Square(boost::python::list& data)
{
boost::python::list ret;
for (int i = 0; i < len(data); ++i)
{
ret.append(data[i] * data[i]);
}
return ret;
}
BOOST_PYTHON_MODULE(test5)
{
def("Square", Square);
}
컴 파일 명령 은 다음 과 같다.
g++ test5.cpp -fPIC -shared -o test5.so -I/usr/include/python2.6 -I/usr/local/include/boost -L/usr/local/lib -lboost_python
테스트 는 다음 과 같다.
>>> import test5
>>> test5.Square([1,2,3])
[1, 4, 9]
boost 는boost::python::tuple
,boost::python::list
,boost::python::dict
이 몇 가지 데이터 형식 을 실 현 했 습 니 다.사용 방법 은 기본적으로 Python 과 일치 합 니 다.구체 적 인 방법 은 boost 헤더 파일 의 boost/python/tuple.hpp 및 기타 대응 하 는 파일 을 볼 수 있 습 니 다.또한 비교적 자주 사용 하 는 함 수 는
boost::python::make_tuple()
이 고 사용 방법 은 다음 과 같다.
boost::python::tuple(int a, int b, int c)
{
return boost::python::make_tuple(a, b, c);
}
총결산이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.