加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:23:19 所属栏目:Python 来源:网络整理
导读:我正在通过 Python运行C代码,并希望挑选一个扩展类型. 所以我有一个C结构(py_db_manager),它包含指向数据库对象的指针和一个用C语言编写的对象管理器对象(都是用C语言编写的)(t_db_manager).我的问题是这个python类型需要知道如何pickle两个指针,以便将它发
我正在通过 Python运行C代码,并希望挑选一个扩展类型.

所以我有一个C结构(py_db_manager),它包含指向数据库对象的指针和一个用C语言编写的对象管理器对象(都是用C语言编写的)(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;
}

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读