2016-12-29 7 views
1

projecttensorflow.python.pywrap_tensorflow이라는 단일 모듈에 일련의 C++ 함수 및 유형에 대한 래퍼를 자동으로 생성하기 위해 SWIG을 사용합니다. 파이썬 C API를 직접 사용하여 새로운 유형을 정의하고이를 해당 모듈에 추가하려고합니다. (특히, 나는 내가 memoryview로 기본 버퍼를 노출 할 수 있도록 Python buffer protocol를 구현하는 새로운 유형을 정의 할 수 있습니다.)SWIG 및 Python : 수동 생성 클래스를 SWIG 생성 모듈에 어떻게 추가 할 수 있습니까?

가 나는 .i 파일을 인라인으로 나의 새로운 유형의 필요한 구조체를 정의 할 수 있습니다 :

%{ 

typedef struct { 
    PyObject_HEAD 
    /* Other fields... */ 
} MyType; 

// Define functions for the initializer, destructor, and buffer protocol: 
// * MyType_init 
// * MyType_dealloc 
// * MyType_old_getbuffer (the readbufferproc for Python 2.7) 
// * MyType_segcount (for Python 2.7) 
// * MyType_getbuffer (the Python 2.7/3.x buffer protocol) 

// ... 

static PyBufferProcs MyType_as_buffer = { 
#if PY_VERSION_HEX < 0x03000000 
    (readbufferproc)MyType_old_getbuffer, 
    (writebufferproc)0, 
    (segcountproc)MyType_segcount, 
    (charbufferproc)0, 
#endif 
    (getbufferproc)MyType_getbuffer, 
    (releasebufferproc)0, 
}; 

static PyTypeObject MyType_TypeObject = { 
    /* PyObject header changed in Python 3 */ 
#if PY_VERSION_HEX>=0x03000000 
    PyVarObject_HEAD_INIT(NULL, 0) 
#else 
    PyObject_HEAD_INIT(NULL) 
    0 /* ob_size */, 
#endif 
    "MyType" /* tp_name */, 
    sizeof(MyType) /* tp_basicsize */, 
    0 /* tp_itemsize */, 
    (destructor)MyType_dealloc /* tp_dealloc */, 
    0 /* tp_print */, 
    0 /* tp_getattr */, 
    0 /* tp_setattr */, 
#if PY_VERSION_HEX>=0x03000000 
    0 /* tp_reserved in 3.0.1 */ 
#else 
    0 /* tp_compare */, 
#endif 
    0 /* tp_repr */, 
    0 /* tp_as_number */, 
    0 /* tp_as_sequence */, 
    0 /* tp_as_mapping */, 
    0 /* tp_hash */, 
    0 /* tp_call */, 
    0 /* tp_str */, 
    0 /* tp_getattro */, 
    0 /* tp_setattro */, 
    &MyType_as_buffer /* tp_as_buffer */, 
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER /* tp_flags */, 
    "Python wrapper for MyType." /* tp_doc */, 
    0 /* tp_traverse */, 
    0 /* tp_clear */, 
    0 /* tp_richcompare */, 
    0 /* tp_weaklistoffset */, 
    0 /* tp_iter */, 
    0 /* tp_iternext */, 
    0 /* tp_methods */, 
    0 /* tp_members */, 
    0 /* tp_getset */, 
    0 /* tp_base */, 
    0 /* tp_dict */, 
    0 /* tp_descr_get */, 
    0 /* tp_descr_set */, 
    0 /* tp_dictoffset */, 
    (initproc)MyType_init /* tp_init */, 
}; 

%} 

이렇게하면, I는 아마도 모듈 초기화 블록 (%init %{ ... %})에서 PyModule_AddObject()를 호출하여 SWIG 생성 모듈 타입 오브젝트를 추가 할. 그러나 tensorflow.python.pywrap_tensorflow 모듈을 생성하는 코드에서 Py_InitModule() (또는 Python 3.x에서는 PyModule_Create())에서 반환 된 값에 어떤 이름을 부여해야할지 모르겠습니다. %init %{ ... %} 블록에 두 번째 모듈을 만들 수 있었지만 가능한 경우 자동 생성 모듈에 추가하는 것이 좋습니다.

  • PyObject*에 대응하기위한 변수 이름에 확장하여 예 초기화 블록에서 생성 된 모듈 객체를 액세스하기위한 꿀꺽 꿀꺽 매크로 (거기 :

    이러한 질문 중 하나에 대한 대답은 내 문제를 해결할 것)? 이 객체는 생성 된 코드에서 m이라는 로컬 변수에 저장되는 것으로 보이지만 모든 배포판에서 동일하게 보장되는지는 알 수 없습니다.

  • 아니면 SWIG를 사용하여 달성하려는 일을하는 관용적 인 방법이 있습니까? 버퍼 프로토콜 typemaps 보이는 그들의 documentation 버퍼 프로토콜을 구현하는 내 래퍼 형식을 원하는 반면 인수로 버퍼를 받아들이는 함수를 작성하도록 설계된 것처럼 보였다.

답변

0

자신 만의 클래스 또는 구조체를 작성하는 경우 swig는 파이썬 유형을 작성하므로 슬롯을 추가하기 만하면됩니다. % feature (파이썬 : 슬롯)를 사용해보십시오. 이 기능을 사용하면 임의의 함수/구조를 생성 된 파이썬 유형 슬롯에 추가 할 수 있습니다. 또한 '-builtin'옵션을 사용하여 .i 파일을 빌드하고 불필요한 프록시 파이썬 파일을 방출하십시오.