swig-python 의 C++인터페이스

선언:
swig 는 다양한 고급 언어(예 를 들 어 python,R,Java 등)가 C/C++에 대한 사용 을 실현 하고 변환 인 터 페 이 스 를 제공 할 수 있 습 니 다.여 기 는 프로젝트 의 수요 로 인해 Python 이 C++에 대한 지원 을 소개 합 니 다.(본 고 는 다른 네트워크 글 을 참고 하지만 코드 는 모두 검증 을 거 쳐 가능 합 니 다)
SWIG 설치(ubuntu 14.04):
  • 1.pcre 설치(pcre 정규 표현 식 지원)
  • sudo apt-get update sudo apt-get install libpcre 3 libpcre 3-dev 설치 가 필요 할 수 있 습 니 다:sudo apt-get install openssl libssl-dev
  • 2.SWIG 설치:
  • sudo apt-get install swig
    설치 완료
    간단히 사용 하 다
  • 1.c+언어 로 헤더 파일 과 원본 파일 을 작성 합 니 다.헤더 파일 example.h:
  •     int fact(int n);
    

    원본 파일 example.cpp:
       #include "example.h"
    
       int fact(int n){
        if(n<0){
        return 0;
        }
        if(n==0){
        return 1;
        }
        else{
        return (1+n)*fact(n-1);
        }
       }
    
  • 2.swig 모듈 을 써 서 파일 example.i:
  • %module example
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    
    int fact(int n);
    
  • 3.swig 를 사용 하여 cxx 파일 을 생산 하고 python 모듈 을 만 듭 니 다.
  • swig -c++ -python example.i
    명령 을 실행 하면 두 개의 다른 파일 이 생 성 됩 니 다:examplewrap.cxx 와 example.py.
  • 4.마지막 단 계 는 python 자체 도구 distutils 를 이용 하여 동적 라 이브 러 리 를 생 성 합 니 다.python 은 distutils 도 구 를 가지 고 있 습 니 다.python 의 확장 모듈 을 만 들 수 있 습 니 다.이 를 사용 하려 면 설정 파일 을 먼저 정의 해 야 합 니 다.보통 setup.py
  • 라 고 명명 되 어 있 습 니 다.
    """
    setup.py
    """
    
    from distutils.core import setup, Extension
    
    example_module = Extension('_example',
                sources=['example_wrap.cxx','example.cpp'],
                )
    
    setup (name='example',
           version='0.1',
           author="SWIG Docs",
           description="""Simple swig example from docs""",
           ext_modules=[example_module],
           py_modules=["example"],
          )
    

    메모:헤더 파일 과 원본 파일 이 모두 example.*이면 setup.py 스 크 립 트 의 Extension 인 자 는""이 어야 합 니 다.example"
  • 5.컴 파일
  • python setup.py build_ext --inplace
  • 6.python 명령 행 테스트:
  • >>>import example
    >>>example.fact(4)
    24
    >>>
    

    *7.STL 지원
    *7.1. vector
    %module example
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    %include stl.i
    namespace std{
    %template(VectorOfString) vector;
    }
    
    int fact(int n);
    std::vector<:string> getname(int n);
    

    *7.2. vector >
    %module example
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    %include stl.i
    namespace std{
    %template(stringvector) vector;
    %template(stringmat) vector >;
    }
    
    int fact(int n);
    std::vector<:vector> > getname(int n);
    

    *7.3.vector>2 차원 vector(다 차원 vector 정의+struct)
    %module example
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    
    %include stl.i
    struct point
    {
    int i;
    int j;
    };
    
    namespace std{
    %template(stringvector) std::vector;
    %template(stringmat) std::vector<:vector> >;
    }
    std::vector<:vector> > getname(int n); 
    /*  
    namespace std  ,   vector    vector   ,             ,       ,             ,            namespace std  :
    namespace std{
    %template(stringvector) std::vector;
    %template(stringmat) std::vector<:vector> >;
    }
                    ,        ,            ,     ,    std::vector     ,         std::vector  ,     ,            ,       .
    */
    

    좋은 웹페이지 즐겨찾기