如何在调用PyRun_String(…)返回NULL后获取异常信息?

2024-10-01 22:25:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试运行以下代码:

Py_Initialize();
PyObject *py_main = PyImport_AddModule("__main__");
PyObject *py_dict = PyModule_GetDict(py_main);
PyObject *ret = PyRun_String(SOME_PYTHON_CODE, Py_file_input, py_dict, py_dict);

但是在我生成的python代码(SOME_PYTHON_CODE)中似乎有一个错误,因此ret显示为NULL,表示发生了异常。如何访问此异常?在


Tags: 代码pymaincodesomepyrundictpyobject
2条回答

您可以:

PyErr_Print();

在标准错误时打印出标准堆栈跟踪。我认为最简单的方法是处理更简单的调用,但我认为这是最简单的方法。在

您还可以通过以下方式获取实际的异常/回溯对象:

^{pr2}$

如果设置了错误指示符,ex将非空。有关详细信息,请参见Exception Handling。在

And here is a question/answer关于访问回溯对象。其中一个答案显示了如何将回溯复制到一个C字符串中,然后可以将其写入文件(或者在本例中是GUI)。在

由于您没有指定SOME_PYTHON_CODE语句的数量,因此可能存在另一个问题:根据Boost Python教程的this pagePyRun_String的输出也取决于start参数:

  • Py_eval_input用于解释孤立的表达式
  • Py_file_input用于解释语句序列
  • Py_single_input用于解释单个语句

它接着说:

When using Py_eval_input, the input string must contain a single expression and its result is returned. When using Py_file_input, the string can contain an abitrary number of statements and None is returned. Py_single_input works in the same way as Py_file_input but only accepts a single statement.

因此,如果您在对PyRun_String的调用中使用Py_file_input,您将始终收到{}。相反,您可以使用Py_single_input。在

相关问题 更多 >

    热门问题