要运行解释器交互式循环,您应该使用该函数PyRun_InteractiveLoop() http://docs.python.org/c-api/veryhigh.html#PyRun_InteractiveLoop。否则,您的代码的行为就像是在 Python 脚本文件中编写的,而不是交互输入的。
Edit:这是一个简单的交互式解释器的完整代码:
#include <Python.h>
int main()
{
Py_Initialize();
PyRun_InteractiveLoop(stdin, "<stdin>");
Py_Finalize();
}
Edit2:在 GUI 中实现完整的交互式解释器是一个项目。也许最简单的方法是编写一个连接到伪终端设备的基本终端模拟器,并在该设备上使用上述代码。这将自动让所有微妙之处都正确。
如果您的目标不是成熟的交互式编辑器,则可以选择使用PyRun_String()
with Py_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 中编写一个基本的终端仿真器,这应该不会太难——或者甚至可能有一个可用的。