2015-02-24 88 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