要运行解释器交互循环,您应该使用函数PyRun_InteractiveLoop()
. 否则,您的代码将表现得好像它是在 Python 脚本文件中编写的,而不是以交互方式输入的。
编辑:这是一个简单的交互式解释器的完整代码:
#include <Python.h>
int main()
{
Py_Initialize();
PyRun_InteractiveLoop(stdin, "<stdin>");
Py_Finalize();
}
Edit2:在 GUI 中实现一个完整的交互式解释器是一个项目。可能最简单的方法是编写一个连接到伪终端设备的基本终端仿真器,并在该设备上使用上述代码。这将自动使所有细微之处都正确。
如果您的目标不是一个成熟的交互式编辑器,一个选项可能是使用PyRun_String()
withPy_single_input
作为开始标记。这将允许您像在交互式解释器中一样运行一些 Python 代码,并且如果该代码恰好是一个不计算为 的表达式,None
则会打印其值的表示形式——当然是到标准输出。这是一些示例代码(为简单起见,没有错误检查):
#include <Python.h>
int main()
{
PyObject *main, *d;
Py_Initialize();
main = PyImport_AddModule("__main__");
d = PyModule_GetDict(main);
PyRun_String("a = (1, 2, 3)", Py_single_input, d, d);
PyRun_String("a", Py_single_input, d, d);
Py_Finalize();
}
这将打印(1, 2, 3)
.
还是有很多问题:
- 没有错误处理和回溯打印。
- 对于交互式解释器中的块命令,没有“增量输入”。输入需要完整。
- 输出到标准输出。
- 如果给出多行输入,则不打印任何内容。
真正复制交互式解释器的行为并不容易。这就是为什么我最初的建议是在你的 GUI 中编写一个基本的终端仿真器,这不应该太难——或者甚至可能有一个可用的。