2015-02-24 30 views
0

我想從C++代碼中調用Python的pickling例程(dumpsloads)。他們暴露在官方API中嗎?我目前通過C++的boost :: python調用這些函數,可能會尋找更簡單的方法。酸洗程序可以通過C API訪問嗎?

+0

我不認爲他們可以被「暴露」,他們需要一個正在運行的解釋器,你可以爲'dumps'和'loads'獲取PyObject * s,然後使用C-API調用它們? – 2015-02-24 10:40:07

+0

還有[如何從C讀取python pickle數據庫/文件?](http://stackoverflow.com/q/1296162) – 2015-02-24 10:57:51

回答

0

您可以撥打通過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導入機制更簡單。

+0

謝謝,我通過C API調用Python(包裝在boost :: python ),但我希望能夠「直接」調用酸洗功能。 – eudoxos 2015-02-24 10:46:13

+0

@eudoxos:你在使用Python 2還是3? C模塊在Python 3中被重命名爲['_pickle'](https://hg.python.org/cpython/file/3.4/Modules)。它取決於是否cPickle模塊靜態地編譯或需要在這裏動態加載。 – 2015-02-24 10:55:52

+0

我想支持兩者。我爲py3k導入_pickle,爲py2k導入cPickle。 – eudoxos 2015-02-24 10:59:10