我正在用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时则不会。
答案 0 :(得分:3)
我遇到了类似的问题,并通过在用户命令行后面使用Py_Run_SimpleString添加“\ n”(回车)来解决它,如下例所示:
PyRun_String(line, Py_single_input, py_dict, py_dict);
PyRun_SimpleString("\n");
如果在PyRun_String的末尾添加“\ n”,它将不起作用。它需要是对PyRun_SimpleString
的单独调用答案 1 :(得分:0)
首先在PyImport_AddModule
的文档中有这个:
首先检查模块字典是否存在,如果没有,则创建一个新模板并将其插入模块字典中。返回NULL并在失败时设置异常。
您不会先检查模块是否已在字典中。
在PyRun_String
的文档中,有以下内容:
返回以Python对象的形式执行代码的结果,如果引发异常则返回NULL。
你永远不会检查它是否成功。
您的代码中还缺少一些其他内容。我认为重点是你去阅读文档并确保你理解它的内容并编写检查错误条件所需的代码等等......