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)。我怎样才能让我的代码做用户期望的事情并打印出价值?

提前致谢!

4

1 回答 1

7

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

于 2012-03-02T22:43:18.163 回答