我想从C++代码中调用Python的pickling例程(dumps
和loads
)。他们暴露在官方API中吗?我目前通过C++的boost :: python调用这些函数,可能会寻找更简单的方法。酸洗程序可以通过C API访问吗?
回答
您可以拨打通过C API的任何 Python代码:
static PyObject *module = NULL;
PyObject *pickle;
if (module == NULL &&
(module = PyImport_ImportModuleNoBlock("pickle")) == NULL)
return NULL;
现在,你可以这样调用它:
pickle = PyObject_CallMethodObjArgs(module,
PyString_AS_STRING("dumps"),
py_object_to_dump,
NULL);
pickle = PyObject_CallMethodObjArgs(module,
PyUnicode_FromString("dumps"),
py_object_to_dump,
NULL);
或类似:
picle = PyObject_CallMethod(module, "dumps", "O", py_object_to_dump);
然后做错误检查和清理:
if (pickle != NULL) { ... }
Py_XDECREF(pickle);
但在pickle
的情况下,你才可以直接使用cPickle
functions。唯一的问题是cPickle
模块(或Python 3中的_pickle
)静态编译到Python二进制文件中,或者需要单独加载。在这里使用Python导入机制更简单。
谢谢,我通过C API调用Python(包装在boost :: python ),但我希望能够“直接”调用酸洗功能。 – eudoxos 2015-02-24 10:46:13
@eudoxos:你在使用Python 2还是3? C模块在Python 3中被重命名为['_pickle'](https://hg.python.org/cpython/file/3.4/Modules)。它取决于是否cPickle模块静态地编译或需要在这里动态加载。 – 2015-02-24 10:55:52
我想支持两者。我为py3k导入_pickle,为py2k导入cPickle。 – eudoxos 2015-02-24 10:59:10
- 1. 我可以通过webservice访问远程数据库吗? C#winforms
- 2. 我可以通过Chrome扩展程序访问Gears吗?
- 3. 我可以通过Web API访问IIdentity
- 4. GT.M可以通过端口访问吗?
- 5. 我可以通过XBAP访问web.config吗?
- 6. 酸洗数据问题
- 7. 酸洗对象
- 8. 酸洗的OrderedDict
- 9. 我可以通过API访问Facebook广告账单数据吗?
- 10. 可以通过无铬API访问document.body.scrollHeight吗?
- 11. Google Maps API可以通过Java,Python或Ruby访问吗?
- 12. 的Python酸洗
- 13. 酸洗AppEngine上
- 14. 如何避免酸洗字典VS酸洗列表的处罚
- 15. 酸洗内部类
- 16. OpenLaszlo应用程序可以访问AIR API吗?
- 17. iPhone:我的程序可以使用imagepicker API访问相机吗?
- 18. 酸洗类方法
- 19. 可以通过c#锁定序列化访问外部资源吗?
- 20. Can Bing空间数据服务可以通过C#编程访问吗?
- 21. 我的程序可以访问超过4GB的内存吗?
- 22. 哪些API可以通过Google API for PHP访问?
- 23. 我可以通过任何设备访问Azure应用程序吗?
- 24. 我可以通过ruby驱动程序访问mongo的geoNear功能吗?
- 25. 我可以通过我的iPhone应用程序访问未接电话吗
- 26. 您可以通过应用程序访问Android手机上的短信吗?
- 27. 我可以通过应用程序事件访问主页面吗?
- 28. iPhone API可以访问Mail/Messages/etc吗?
- 29. Facebook API:它可以访问“笔记”吗?
我不认为他们可以被“暴露”,他们需要一个正在运行的解释器,你可以为'dumps'和'loads'获取PyObject * s,然后使用C-API调用它们? – 2015-02-24 10:40:07
还有[如何从C读取python pickle数据库/文件?](http://stackoverflow.com/q/1296162) – 2015-02-24 10:57:51