我正在用 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;
}
它工作得很好,命令行被执行,结果通过标准输出打印在输出窗口上。但是每当 Python 命令行导致 Python 错误时,它就会停止工作:My stdout doesn't receive any data
注意事项:
PyRes 总是返回 NULL,甚至在注入(inject)错误行之前也是如此
我不知道是否应该每次都调用 PyImport_AddModule。但它似乎是这样工作的。
如果我使用 PyRun_SimpleString(line) 代替 PyRun_String(line, Py_single_input, py_dict, py_dict),它总是有效,但我仍然会收到错误通过 stdout/stderr 的消息。但是这个调用不会将命令行评估的结果发送到标准输出,所以我不想使用它。例如,当我使用 PyRun_String 时,命令行“2+2”将在标准输出上打印“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
关于c++ - PyRun_String 在任何错误后停止将结果发送到标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12518435/