gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:30:22 25 4
gpt4 key购买 nike

我正在通过 Python 运行 C++ 代码,并且想要 pickle 一个扩展类型。

因此,我有一个 C++ 结构 (py_db_manager),其中包含指向数据库对象和对象管理器对象(均用 C++ 编写)的指针,我用 python 类型对象 (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;
}

最佳答案

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

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

关于python - pickle 定义为具有 PyObject* 成员的 C 结构的 Python 扩展类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5996010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com