挑选一个Python扩展类型,定义为具有PyObject *成员的C结构
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了挑选一个Python扩展类型,定义为具有PyObject *成员的C结构,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1406字,纯文字阅读大概需要3分钟。
内容图文
![挑选一个Python扩展类型,定义为具有PyObject *成员的C结构](/upload/InfoBanner/zyjiaocheng/769/891d57b3ad034a6d863d1a368b3baacf.jpg)
我正在通过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;
}
解决方法:
因为这将被传递给另一个进程,所以只选择整数指针就不会像你想要的那样工作.不同的进程使用不同的内存空间,因此它们看不到相同的内容.
因此,要回答您的问题,您应该挑选完整的对象并从接收端重建它们.
内容总结
以上是互联网集市为您收集整理的挑选一个Python扩展类型,定义为具有PyObject *成员的C结构全部内容,希望文章能够帮你解决挑选一个Python扩展类型,定义为具有PyObject *成员的C结构所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。