要运行解释器的交互循环,您应该使用函数
PyRun_InteractiveLoop()
。否则,您的代码将表现得好像它是在Python脚本文件中编写的,而不是交互输入的。
编辑:这是一个简单交互式解释器的完整代码:
#include <Python.h>
int main()
{
Py_Initialize();
PyRun_InteractiveLoop(stdin, "<stdin>");
Py_Finalize();
}
Edit2: 在GUI中实现一个完整的交互式解释器是一个比较大的项目。也许最简单的方法是编写一个基本的终端仿真器连接到一个伪终端设备,并在该设备上使用上述代码。这将自动得到所有微妙之处的正确处理。
如果你的目标不是一个完整的交互式编辑器,一个选择可能是使用
PyRun_String()
和
Py_single_input
作为起始标记。这将允许你像在交互式解释器中一样运行一些Python代码,如果那段代码恰好是一个不会评估为
None
的单个表达式,则其值的表示将被打印出来--当然是到stdout。下面是一些示例代码(为了简单起见,没有错误检查):
#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中编写一个基本的终端仿真器,这应该不太难-或者可能已经有一个可用。
print
结果。 - Niklas B.