挑选一个Python扩展类型,定义为具有PyObject *成员的C结构
发布时间:2020-12-20 13:23:19 所属栏目:Python 来源:网络整理
导读:我正在通过 Python运行C代码,并希望挑选一个扩展类型. 所以我有一个C结构(py_db_manager),它包含指向数据库对象的指针和一个用C语言编写的对象管理器对象(都是用C语言编写的)(t_db_manager).我的问题是这个python类型需要知道如何pickle两个指针,以便将它发
我正在通过
Python运行C代码,并希望挑选一个扩展类型.
所以我有一个C结构(py_db_manager),它包含指向数据库对象的指针和一个用C语言编写的对象管理器对象(都是用C语言编写的)(t_db_manager).我的问题是这个python类型需要知道如何pickle两个指针,以便将它发送到一些子多核进程.所以我用copy_reg模块注册了这个类型(这相当于在类型上编写了一个reduce()方法.但是,我不太清楚要放入什么.我应该用PyObject *构建一个元组,还是仅仅是整数指针?有人可以帮忙吗? typedef struct { PyObject_HEAD PyObject* man_inst_ ; PyObject* db_inst_ ; }py_db_manager;` 这是Py_TypeObject PyTypeObject t_db_manager = { PyObject_HEAD_INIT(0) /* tp_head */ 0,/* tp_internal */ ".py_db_manager",/* tp_name */ sizeof(py_db_manager)}; 这是reduce方法中的代码: PyObject *pickle_manager(PyObject *module,PyObject *args) { py_db_manager *cpp_manager =0; PyObject *values = NULL,*tuple = NULL; char text[512]; if (!PyArg_ParseTuple(args,"O!",&t_db_manager,&cpp_manager)) goto error; sprintf(text,"man_inst_,db_inst_"); if ((values = Py_BuildValue("(sii)",text,cpp_manager->man_inst_,cpp_manager->db_inst_)) == NULL) goto error; tuple = Py_BuildValue("(OO)",manager_constructor,values); error: Py_XDECREF(values); return tuple; } 解决方法
因为这将被传递给另一个进程,所以只选择整数指针就不会像你想要的那样工作.不同的进程使用不同的内存空间,因此它们看不到相同的内容.
因此,要回答您的问题,您应该挑选完整的对象并从接收端重建它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |