如何使用纯Python扩展API(python3)包装C ++对象?

如何使用纯Python扩展API(python3)包装C ++对象?,第1张

如何使用纯Python扩展API(python3)包装C ++对象

似乎答案实际上在这里: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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5645916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存