【发布时间】:2019-06-10 12:49:26
【问题描述】:
我在调用 Python 的 C 代码中遇到访问冲突错误。
我正在尝试从 Python 调用一个 sympy 函数并在 C 中处理结果。
#include <Python.h>
int main(int argc, char *argv[])
{
PyObject *pmod, *pdict, *pValue;
Py_Initialize();
pmod = PyImport_ImportModule("sympy");
PyErr_Print();
pdict = PyModule_GetDict(pmod);
pValue = PyRun_String("x = symbols('x'); diff(cos(x), x)", Py_single_input, pdict, pdict);
PyErr_Print();
if (pValue != NULL) {
//PyObject* pu = PyUnicode_AsEncodedString(pValue, "utf-8", "~E~");
//printf("Result of call: %s\n", PyBytes_AS_STRING(pu));
//Py_DECREF(pu);
Py_DECREF(pValue);
Py_DECREF(pmod);
Py_DECREF(pdict);
}
else {
PyErr_Print();
return 1;
}
Py_FinalizeEx();
return 0;
}
我想知道这种访问冲突的原因以及如何解决它。我还想知道为什么注释 printf 以显示结果不起作用。
我的编译行是:
gcc probe.c `python3-config --cflags` `python3-config --ldflags` -fpic
我的 Python 版本是 3.6.7。
提前致谢。
【问题讨论】:
-
您确定您的访问违规在
PyRun_String中吗?当我运行代码时,它在Py_Finalize中崩溃。 (由于只有 Python 3.5.2,我不得不将Py_FinalizeEx替换为Py_Finalize。) -
@rtoijala 可能你是对的。我用 python 2.7 和 PyFinalize 进行了测试,然后我得到的错误是:“致命的 Python 错误:删除实习字符串失败”。我真的不在乎使用 python 2 还是 3。我需要的是摆脱错误。
标签: python c python-c-api