任何错误后,PyRun_String都会停止向stdout发送结果

我正在用C ++编写一个Python终端GUI。 我正在使用以下代码来运行用户类型的Python命令行:

void RunTerminalCommand (char * line) { PyObject *py_main, *py_dict; py_main = PyImport_AddModule("__main__"); py_dict = PyModule_GetDict(py_main); PyObject * PyRes = PyRun_String(line, Py_single_input, py_dict, py_dict); return 0; } 

它工作得非常好,命令行正在执行,结果通过stdout打印在输出窗口上。 但是每当Python命令行导致Python错误时,它就会停止工作:我的stdout不会收到任何数据

笔记:

  • 即使在注入错误行之前,PyRes也总是返回NULL

  • 我不知道每次都应该调用PyImport_AddModule。 但它似乎以这种方式工作。

  • 如果我使用pyRun_SimpleString(line)PyRun_String(line,Py_single_input,py_dict,py_dict) ,它总是有效,我仍然通过stdout / stderr得到错误消息。 但是这个调用不会将命令行evaluateatiosn的结果发送到stdout,所以我不想使用它。 例如,当我使用PyRun_String时,命令行“2 + 2”将在stdout上打印“4”,但是当我使用PyRun_SimpleString时则不会。

我遇到了类似的问题,并通过在用户命令行后面使用Py_Run_SimpleString添加“\ n”(回车)来解决它,如下例所示:

 PyRun_String(line, Py_single_input, py_dict, py_dict); PyRun_SimpleString("\n"); 

如果在PyRun_String的末尾添加“\ n”,它将不起作用。 它需要是对PyRun_SimpleString的单独调用

首先在PyImport_AddModule的文档中有这个:

首先检查模块字典是否存在,如果没有,则创建一个新模板并将其插入模块字典中。 返回NULL并在失败时设置exception。

您不会先检查模块是否已在字典中。

PyRun_String的文档中有这样的:

返回以Python对象的forms执行代码的结果,如果引发exception则返回NULL。

你永远不会检查它是否成功。

您的代码中还缺少一些其他内容。 我认为重点是你去阅读文档并确保你理解它所说的内容并编写检查错误条件所需的代码等等……