- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在调用 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。
提前致谢。
最佳答案
问题是你在不应该的时候破坏了 sympy
模块的字典。根据documentation for PyModule_GetDict
,返回的字典引用是借来的,而不是新的。因此,您不得对其调用 Py_DECREF
。删除带有 Py_DECREF(pdict);
的行可解决此问题。
更多关于所有权和从 Python documentation 借用的信息:
Ownership can also be transferred, meaning that the code that receives ownership of the reference then becomes responsible for eventually decref’ing it by calling
Py_DECREF()
orPy_XDECREF()
when it’s no longer needed—or passing on this responsibility (usually to its caller). When a function passes ownership of a reference on to its caller, the caller is said to receive a new reference. When no ownership is transferred, the caller is said to borrow the reference. Nothing needs to be done for a borrowed reference.
关于python - PyRun_String() 中的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56526758/
我在调用 Python 的 C 代码中遇到访问冲突错误。 我正在尝试从 Python 调用一个 sympy 函数并在 C 中处理结果。 #include int main(int argc, cha
我正在用 C++ 编写 Python 终端 GUI。我正在使用以下代码来运行用户键入的 Python 命令行: void RunTerminalCommand (char * line) {
我需要从 C++ 计算 Python 表达式。此代码似乎有效: PyObject * dict = PyDict_New(); PyObject * val = PyRun_String(expres
我正在尝试运行以下代码: Py_Initialize(); PyObject *py_main = PyImport_AddModule("__main__"); PyObject *py_dict
我正在尝试在 C++ 程序中运行一些 python 文件,该文件实际上作为 std::string 包含在 C++ 代码中,称为 command。 我已成功使用 PyRun_SimpleString(
PyRun_String("if True: 1\nelse: 0", Py_eval_input, globals, globals); 使用 PyErr_Print() 打印返回错误: File
PyRun_String("random.randint(1,10)", Py_eval_input, globals, globals); 返回错误: Traceback (most recent
我是一名优秀的程序员,十分优秀!