在嵌入式Python解释器中打印变量
我编写了一个嵌入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)。 如何让我的代码执行用户期望的操作并打印出值?
提前致谢!
要运行解释器交互循环,您应该使用函数PyRun_InteractiveLoop()
。 否则,您的代码就会像在Python脚本文件中编写一样,而不是以交互方式输入。
编辑 :这是一个简单的交互式解释器的完整代码:
#include int main() { Py_Initialize(); PyRun_InteractiveLoop(stdin, ""); Py_Finalize(); }
Edit2 :在GUI中实现完整的交互式解释器是一个项目。 可能最简单的方法是编写连接到伪终端设备的基本终端仿真器,并在该设备上使用上述代码。 这将自动获得所有细微之处。
如果你的目标不是一个完整的交互式编辑器,一个选项可能是使用PyRun_String()
和Py_single_input
作为开始标记。 这将允许您在交互式解释器中运行一些Python代码,如果该代码碰巧是一个不评估为None
的单个表达式,则会打印其值的表示forms – 当然是stdout。 这是一些示例代码(为简单起见,没有错误检查):
#include 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)
。
还有很多问题:
- 没有error handling和回溯打印。
- 没有像交互式解释器中那样的块命令的“增量输入”。 输入需要完整。
- 输出到stdout。
- 如果给出多行输入,则不打印任何内容。
要真正复制交互式解释器的行为并不容易。 这就是为什么我最初的建议是在你的GUI中编写一个基本的终端模拟器,这不应该太难 – 或者甚至可能有一个。