我想從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. Python酸洗問題
- 2. 我可以通過webservice訪問遠程數據庫嗎? C#winforms
- 3. 我可以通過Chrome擴展程序訪問Gears嗎?
- 4. 我可以通過Web API訪問IIdentity
- 5. GT.M可以通過端口訪問嗎?
- 6. 我可以通過XBAP訪問web.config嗎?
- 7. 酸洗數據問題
- 8. Google Maps API可以通過Java,Python或Ruby訪問嗎?
- 9. 我可以通過API訪問Facebook廣告賬單數據嗎?
- 10. 可以通過無鉻API訪問document.body.scrollHeight嗎?
- 11. 酸洗對象
- 12. 酸洗的OrderedDict
- 13. 的Python酸洗
- 14. 酸洗AppEngine上
- 15. 酸洗數據
- 16. iPhone:我的程序可以使用imagepicker API訪問相機嗎?
- 17. OpenLaszlo應用程序可以訪問AIR API嗎?
- 18. 如何避免酸洗字典VS酸洗列表的處罰
- 19. 酸洗內部類
- 20. 酸洗類方法
- 21. 酸洗使用defaultdict
- 22. 可以通過c#鎖定序列化訪問外部資源嗎?
- 23. Can Bing空間數據服務可以通過C#編程訪問嗎?
- 24. Python字典酸洗
- 25. 我的程序可以訪問超過4GB的內存嗎?
- 26. 訪問通過API
- 27. 您可以通過Facebook Graph API訪問附加到事件的問題嗎?
- 28. 哪些API可以通過Google API for PHP訪問?
- 29. iPhone API可以訪問Mail/Messages/etc嗎?
我不認爲他們可以被「暴露」,他們需要一個正在運行的解釋器,你可以爲'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