Fiz*_*uzz 4 c python interpreter python-embedding python-c-api
我编写了一个嵌入Python的小程序.我正在使用Py_Initialize()和Py_Finalize()正确设置它,并且能够使用PyRun_SimpleString或PyRun_SimpleFile运行脚本.但是,我不知道在打印变量时如何模仿Python自己的解释器的行为.
特别:
a = (1, 2, 3)
print a
Run Code Online (Sandbox Code Playgroud)
适合我的工作:打印出来(1,2,3)
然而:
a = (1, 2, 3)
a
Run Code Online (Sandbox Code Playgroud)
什么都没有打印出来.在Python自己的解释器中,这也会打印出(1,2,3).如何让我的代码执行用户期望的操作并打印出值?
提前致谢!
要运行解释器交互循环,您应该使用该函数PyRun_InteractiveLoop().否则,您的代码就会像在Python脚本文件中编写一样,而不是以交互方式输入.
编辑:这是一个简单的交互式解释器的完整代码:
#include <Python.h>
int main()
{
Py_Initialize();
PyRun_InteractiveLoop(stdin, "<stdin>");
Py_Finalize();
}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
这将打印(1, 2, 3).
还有很多问题:
要真正复制交互式解释器的行为并不容易.这就是为什么我最初的建议是在你的GUI中编写一个基本的终端模拟器,这应该不会太难 - 或者甚至可能有一个.