Python 에서 C++프로그램 을 호출 하 는 방법 에 대한 상세 한 설명

8051 단어 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
여기 몇 시 주의해 야 돼 요?
  • 생 성 된 동적 라 이브 러 리 이름 이 test 1 이면 원본 파일 에 inittest 1 이라는 함수 가 있어 야 하고 PyInitModule 의 첫 번 째 매개 변 수 는"test 1"이 어야 합 니 다.그렇지 않 으 면 Python 가 져 오기 모듈 이 실패 합 니 다
  • cpp 원본 파일 이 라면 inittest 1 함 수 는 extern"C"로 수식 해 야 하 며,c 원본 파일 이 라면 필요 하지 않 습 니 다.파 이 썬 해석 기 는 라 이브 러 리 를 가 져 올 때 initxxx 와 같은 함 수 를 찾 습 니 다.C 와 C++는 함수 기호 에 대한 인 코딩 방식 이 다 릅 니 다.C+는 함수 기 호 를 인 코딩 할 때 함수 길이 와 매개 변수 유형 을 고려 합 니 다.구체 적 으로nm test1.so를 통 해 함수 기 호 를 볼 수 있 습 니 다.c+filt 도 구 는 기 호 를 통 해 함수 원형 을 역 분해 할 수 있 습 니 다.
  • boost 를 통 해 구현
    우 리 는 위 와 같은 예 를 사용 하여 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);
    }
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

    좋은 웹페이지 즐겨찾기