似乎答案实际上在这里:https :
//docs.python.org/3.6/extending/newtypes.html
有例子,但并不是很容易。
编辑1:
实际上,并不是将C 对象包装在Python对象中,而是使用C代码创建Python对象。(edit2:所以您可以包装C 对象!)
编辑2:
这是使用Python新类型的解决方案
。
原始C ++文件:
Voice.cpp
#include <cstdio>#include "Voice.h"namespace transformation{ Voice::Voice(int fftSize) { printf("c++ constructor of voicen"); this->fftSize=fftSize; mem=new double[fftSize]; } Voice::~Voice() { delete [] mem; } int Voice::filter(int freq) { printf("c++ voice filter methodn"); return (doubleIt(3)); } int Voice::doubleIt(int i) { return 2*i; }}
。
原始h文件:
Voice.h
namespace transformation { class Voice { public: double *mem; int fftSize; Voice(int fftSize); ~Voice(); int filter(int freq); int doubleIt(int i); };}
。
C ++ Python包装器文件:voiceWrapper.cpp
#include <Python.h>#include <cstdio>//~ #include "structmember.h"#include "Voice.h"using transformation::Voice;typedef struct { PyObject_HEAD Voice * ptrObj;} PyVoice;static PyModuleDef voicemodule = { PyModuleDef_HEAD_INIT, "voice", "Example module that wrapped a C++ object", -1, NULL, NULL, NULL, NULL, NULL};static int PyVoice_init(PyVoice *self, PyObject *args, PyObject *kwds)// initialize PyVoice Object{ int fftSize; if (! PyArg_ParseTuple(args, "i", &fftSize)) return -1; self->ptrObj=new Voice(fftSize); return 0;}static void PyVoice_dealloc(PyVoice * self)// destruct the object{ delete self->ptrObj; Py_TYPE(self)->tp_free(self);}static PyObject * PyVoice_filter(PyVoice* self, PyObject* args){ int freq; int retval; if (! PyArg_ParseTuple(args, "i", &freq)) return Py_False; retval = (self->ptrObj)->filter(freq); return Py_BuildValue("i",retval);}static PyMethodDef PyVoice_methods[] = { { "filter", (PyCFunction)PyVoice_filter, METH_VARARGS, "filter the mem voice" }, {NULL} };static PyTypeObject PyVoiceType = { PyVarObject_HEAD_INIT(NULL, 0) "voice.Voice" };PyMODINIT_FUNC PyInit_voice(void)// create the module{ PyObject* m; PyVoiceType.tp_new = PyType_GenericNew; PyVoiceType.tp_basicsize=sizeof(PyVoice); PyVoiceType.tp_dealloc=(destructor) PyVoice_dealloc; PyVoiceType.tp_flags=Py_TPFLAGS_DEFAULT; PyVoiceType.tp_doc="Voice objects"; PyVoiceType.tp_methods=PyVoice_methods; //~ PyVoiceType.tp_members=Noddy_members; PyVoiceType.tp_init=(initproc)PyVoice_init; if (PyType_Ready(&PyVoiceType) < 0) return NULL; m = PyModule_Create(&voicemodule); if (m == NULL) return NULL; Py_INCREF(&PyVoiceType); PyModule_AddObject(m, "Voice", (PyObject *)&PyVoiceType); // Add Voice object to the module return m;}
。
distutils文件:
setup.py
from distutils.core import setup, Extensionsetup(name='voicePkg', version='1.0', ext_modules=[Extension('voice', ['voiceWrapper.cpp','Voice.cpp'])])
。
python测试文件:
test.py
import voicev=voice.Voice(512)result=v.filter(5)print('result='+str(result))
。
和魔术:
sudo python3 setup.py installpython3 test.py
输出为:
c++ constructor of voicec++ voice filter methodresult=6
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)