c++ - PyRun_String 在任何错误后停止将结果发送到标准输出

标签 c++ python c

我正在用 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/

相关文章:

c - 向 C 中的 pthreads 发送和捕获信号

python - 返回树中的值列表

python - 值错误: Could not find a format to write the specified file in single-image mode

python - matplotlib:相同大小的子图?

c - 转换为 libtool 时 automake 和 autoconf 找不到 libtool

c++ - 将二进制字符串转换为整数字符串 C++

c++ - 建立LLVM 10 C++工具链的问题

c++ - 如何使用 C++ api 在 Lotus Notes 文档(电子邮件、任务等)正文中插入 Html 数据?

c++ - 为什么要在空格中插入数字和特殊字符?

日历时间存储为带符号的 32 位整数 - 何时溢出