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

时间:2011-05-13 18:08:51

标签: python c struct pickle pyobject

我正在通过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;
}

1 个答案:

答案 0 :(得分:1)

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

所以,为了回答你的问题,你应该挑选完整的对象并从接收端重建它们。