2

我正在用 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 错误时,它就会停止工作:我的标准输出没有收到任何数据

笔记:

  • PyRes 总是返回 NULL,甚至在错误行被注入之前

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

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

4

2 回答 2

3

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

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

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

于 2012-09-21T13:16:45.120 回答
0

首先在文档中有这个PyImport_AddModule

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

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

在文档中PyRun_String有这样的:

返回作为 Python 对象执行代码的结果,如果引发异常,则返回 NULL。

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

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

于 2012-09-21T08:10:35.820 回答