gpt4 book ai didi

python - Py_Finalize() 在 Python 出错后崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:40 25 4
gpt4 key购买 nike

我正在尝试使用 Py_CompileString()PyEval_EvalCode() 调用一些 python 代码。它工作正常,但是当 Python 代码包含错误时 Py_Finalize() 崩溃。

Py_Initialize();

PyObject* code = Py_CompileString("pprint('Hello World')", "", Py_file_input);
PyObject* m = PyImport_AddModule("__main__");
PyObject* d = PyModule_GetDict(m);
Py_DECREF(m);
PyObject* r = PyEval_EvalCode(code, d, d);
Py_DECREF(d);
if (!r)
PyErr_Print();
Py_DECREF(code);

Py_Finalize();

输出符合预期:

Traceback (most recent call last):
File "", line 1, in <module>
NameError: name 'pprint' is no defined

但随后在调用 Py_Finalize() 时程序崩溃了。如果我将第 3 行更改为

PyObject* code = Py_CompileString("print('Hello World')", "", Py_file_input);

程序正常运行和终止。这里出了什么问题?

如果我在 gdb 中运行该程序,我会得到以下输出:

Windows:
Program received signal SIGSEGV, Segmentation fault.
0x1e01a030 in python32!PyType_IsSubtype () from C:\Windows\SysWOW64\python32.dll

Linux:
Program received signal SIGSEGV, Segmentation fault.
0xb7ef17bb in visit_decref (op=0xb78c87ec, data=0x0) at Modules/gcmodule.c:321
321 Modules/gcmodule.c: File or Directory not found.
in Modules/gcmodule.c

最佳答案

失败的真正原因不是您调用 Py_DECREF 太早了。根本就是你在打电话!

PyImport_AddModule 返回一个借来的 引用。这意味着您根本不允许调用 Py_DECREF 除非您实际控制了它(例如通过 Py_INCREF 增加引用计数)。

Python 将自动对 Py_Finalize 上的模块引用进行垃圾回收。无需额外操作。

关于python - Py_Finalize() 在 Python 出错后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6757741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com