在嵌入式Python解释器中打印一个变量

4
我已经编写了一个嵌入Python的小型C程序。我正在使用Py_Initialize()和Py_Finalize()进行正确设置,并且可以使用PyRun_SimpleString或PyRun_SimpleFile运行脚本。但是,我不知道如何模仿Python自己解释器在打印变量时的行为。
具体而言:
a = (1, 2, 3)
print a

针对我而言,运行正常:它会打印出(1, 2, 3)。

然而:

a = (1, 2, 3)
a

代码没有任何输出。在Python自带的解释器中,这段代码会输出(1,2,3)。我该如何让我的代码按照用户期望的方式输出值呢?

提前感谢您的帮助!


你需要模拟解释器。逐行评估输入并print结果。 - Niklas B.
1个回答

8
要运行解释器的交互循环,您应该使用函数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中编写一个基本的终端仿真器,这应该不太难-或者可能已经有一个可用。


是的,我尝试过这个,但似乎需要交互式输入 - 除非我做错了什么。我尝试的是:FILE *myfile = fopen("example.py","r+"); PyRun_InteractiveLoop(myfile, "example.py"); fclose(myfile); - FizzBuzz
@FizzBuzz:所以你想从文件中读取命令,但希望它们的行为就像是交互式输入的一样?而你声称这正是你的用户所期望的?我肯定我在这里漏掉了什么。 - Sven Marnach
你说得对,我没有表达清楚,抱歉!我的初始测试应用程序在终端上;将Python指向标准输入并让它工作非常简单。但是,我想将其带入GUI中,该GUI应以与用户相同的方式运行,但不能如此轻松地连接。我希望从某个地方(而不是stdin;GUI文本框)读取用户输入,并以与命令行解释器相同的方式执行它。 最初,我使用PyRun_SimpleString()发送每行代码,但我还尝试将命令写入文件并从那里运行。希望这样更清楚一些,感谢您的耐心! - FizzBuzz
@FizzBuzz:是的,非常清楚!谢谢,我会更新我的答案。你在哪个平台上? - Sven Marnach
你的第二次编辑给了我足够的信息开始工作 - 谢谢! - FizzBuzz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接