python - 在 C 中加载 python pickled 对象

标签 python python-c-extension

我知道 pickle 可以很容易地加载到 python 中

import pickle
p = pickle.load(open("file.pkl"))

我想知道如何在 python 中的 pyx/C 代码中加载相同的 pickle 文件?没找到直接加载的方法。

也许解决方案是在 python 中加载并传递对 C 中对象的引用?

最佳答案

简单的答案是使用 Cython 编译代码。那里的一切都会自动完成。

在 Python C API 的上下文中,您可以使用以下内容轻松复制此代码:

PyObject *file = NULL, *p = NULL;
PyObject *pickle = PyImport_ImportModule("pickle"); // import module
if (!pickle) goto error;
file = PyFile_FromString("file.pkl", "r"); // open("file.pkl")
if (!pickle) goto error;
p = PyObject_CallMethod(pickle, "load", "O", file); // pickle.load(file)
error:
Py_XDECREF(pickle);
Py_XDECREF(file);

这是针对 Python 2 完成的,而对于 Python 3 open("file.pkl") 需要使用 io 来实现模块。

关于python - 在 C 中加载 python pickled 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35768773/

相关文章:

Python创建目录报错Cannot create a file when that file already exists

Python 语法问题

python - 用 C : Pass a list to PyArg_ParseTuple 扩展 python

python - 沿所有轴无缝高效地翻转 numpy 数组或稀疏矩阵

python - Python 3 C API 中的文件 I/O

python - 我可以访问包含另一个类的对象列表的对象的属性吗

python - 如何处理 PyObject_GetItem() 函数中的 `key' 参数

python - 使用来自 C 的更高级别的 Python 结构

c - 在 python 中调试 c 扩展

python - PyErr_CheckSignals 没有接收到信号