내 project은 tensorflow.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 버퍼 프로토콜을 구현하는 내 래퍼 형식을 원하는 반면 인수로 버퍼를 받아들이는 함수를 작성하도록 설계된 것처럼 보였다.