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

时间:2012-03-02 22:37:17

标签: python c interpreter python-c-api python-embedding

我编写了一个嵌入Python的小程序。我正在使用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)。如何让我的代码执行用户期望的操作并打印出值?

提前致谢!

1 个答案:

答案 0 :(得分:7)

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