挑选一个Python扩展类型,定义为具有PyObject *成员的C结构

我正在通过Python运行C ++代码,并希望挑选一个扩展类型。

所以我有一个C ++结构(py_db_manager),它包含指向数据库对象的指针和一个用python类型对象(t_db_manager)包装的对象管理器对象(都是用C ++编写的)。 我的问题是这个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; } 

因为这将被传递给另一个进程 ,所以只选择整数指针就不会像你想要的那样工作。 不同的进程使用不同的内存空间,因此它们看不到相同的内容。

因此,要回答您的问题,您应该挑选完整的对象并从接收端重建它们。