Pickling定义为具有PyObject*成员的C结构的Python扩展类型

2024-03-29 04:34:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过Python运行C++代码,想对扩展类型进行酸洗。在

<> p>所以我有一个C++结构(pyydBiManager),它包含指向数据库对象的指针和一个对象管理器对象(用C++编写),用Python类型对象(TydByManager)包装。我的问题是,这个python类型需要知道如何pickle这两个指针,以便将它发送到一些子多核进程。所以我用copy_reg模块注册了这个类型(这相当于在类型上编写了一个reduce()方法。不过,我不太确定该放什么。我应该用PyObject*还是仅仅用整数指针构建一个元组?。有人能帮忙吗?在

typedef struct
{
  PyObject_HEAD
  PyObject* man_inst_ ;
  PyObject* db_inst_ ;

}py_db_manager;`

这是Py_TypeObject

^{pr2}$

下面是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;
}

Tags: 对象textpy类型dbmanagererrornull
1条回答
网友
1楼 · 发布于 2024-03-29 04:34:14

因为这将被传递给另一个进程,所以仅对整数指针进行pickle将不会像您希望的那样工作。不同的进程使用不同的内存空间,因此它们看不到相同的东西。在

因此,为了回答您的问题,您应该对完整的对象进行pickle并从接收端重新构建它们。在

相关问题 更多 >