oct*_*cti 5 c python struct pickle pyobject
我正在通过Python运行C ++代码,并希望选择一个扩展类型。
因此,我有一个C ++结构(py_db_manager),其中包含指向数据库对象的指针和一个对象管理器对象(均以C ++编写),并用python类型的对象(t_db_manager)包装。我的问题是,此python类型需要知道如何腌制两个指针才能将其发送给某些子多核进程。因此,我在copy_reg模块中注册了该类型(这相当于在该类型上编写一个reduce()方法。但是,我不太确定要在其中添加什么。应该使用PyObject *还是仅使用整数指针?有人可以帮忙吗?
typedef struct
{
PyObject_HEAD
PyObject* man_inst_ ;
PyObject* db_inst_ ;
}py_db_manager;`
Run Code Online (Sandbox Code Playgroud)
这是Py_TypeObject
PyTypeObject t_db_manager = {
PyObject_HEAD_INIT(0) /* tp_head */
0, /* tp_internal */
".py_db_manager", /* tp_name */
sizeof(py_db_manager)};
Run Code Online (Sandbox Code Playgroud)
这是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;
}
Run Code Online (Sandbox Code Playgroud)
因为这将被传递到另一个进程,所以仅腌制整数指针将不会像您希望的那样工作。不同的进程使用不同的内存空间,因此它们看不到相同的东西。
因此,要回答您的问题,您应该腌制完整的对象并从接收端重建它们。
归档时间: |
|
查看次数: |
991 次 |
最近记录: |