Python SystemError when using the C API PyRun_String

Python SystemError when using the C API PyRun_String

本文关键字:API PyRun String the SystemError when using Python      更新时间:2023-10-16

我试图在C 程序中运行一些python文件,这些文件实际上包含在c 代码中,为 std::string称为 command

我已经成功使用了PyRun_SimpleString(command.c_str()),但是这可以防止获得异常信息。

我现在尝试以下内容:

PyObject* result = PyRun_String(command.c_str(), Py_file_input, PyEval_GetGlobals(), PyEval_GetLocals());

但是,这引发了:

SystemError: frame does not exist

我在做什么错?

更新:

我尝试使用以下内容将过程分为编译 评估:

PyObject* code = Py_CompileString(command.c_str(), filename.c_str(), Py_file_input);
PyObject* result = PyEval_EvalCode(code, PyEval_GetGlobals(), PyEval_GetLocals());

现在,错误是不同的:

SystemError: PyEval_EvalCodeEx: NULL globals

这可能更具解释性,正如它在C API doc ::

中所说的那样

返回当前执行框架中全局变量的字典,或者如果当前没有框架执行。

我不确定我知道什么是框架。

我找到了一个解决方案。我可能何时不了解框架是否正在出口,但事实证明,在启动解释器后,没有帧正在运行。这就是为什么PyEval_GetGlobals()PyEval_GetLocals()返回NULL并在以后引起错误的原因。

相反,默认模块__main__的命名空间应用作全球和当地人名称空间:

PyObject* d = PyModule_GetDict(PyImport_AddModule("__main__"));
PyObject* result = PyRun_String(command.c_str(), Py_file_input, d, d);
Py_DECREF(result);