Canonical嵌入式交互式Python解释器示例?

时间:2011-01-04 17:11:06

标签: python c

我想在我的C / C ++应用程序中创建一个嵌入式Python解释器。理想情况下,此解释器的行为与真正的Python解释器完全相同,但在处理每行输入后会产生效果。标准Python模块code从外部看起来与我想要的完全一样,除了它是用Python编写的。 E.g:

>>> import code
>>> code.interact()
Python 2.7.1 (r271:86832, Jan  3 2011, 15:34:27) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

code的核心是接受可能不完整的用户输入并显示语法错误(案例1),等待更多输入(案例2)或执行用户输入(案例3)的函数。

try:
    code = self.compile(source, filename, symbol)
except (OverflowError, SyntaxError, ValueError):
    # Case 1
    self.showsyntaxerror(filename)
    return False

if code is None:
    # Case 2
    return True

# Case 3
self.runcode(code)
return False

Python源代码树Demo/embed/demo.c中的示例是外壳,但不是我想要的,因为该示例仅处理完整语句。我将其中的一部分包含在此作为参考:

/* Example of embedding Python in another program */
#include "Python.h"

main(int argc, char **argv)
{
    /* Initialize the Python interpreter.  Required. */
    Py_Initialize();
    [snip]
    /* Execute some Python statements (in module __main__) */
    PyRun_SimpleString("import sys\n");
    [snip]
    /* Exit, cleaning up the interpreter */
    Py_Exit(0);
}

我正在寻找的是处理不完整块,堆栈跟踪等的C代码。也就是说,真正的Python解释器的所有行为。提前谢谢。

2 个答案:

答案 0 :(得分:2)

看看boost.python。它是C ++中Python的完美集成,反之亦然。

但是无论如何你都可以使用C API。 PyRun_InteractiveLoopFlags()函数在C ++应用程序中提供交互式控制台。

答案 1 :(得分:1)

看看我在C ++中实现的python解释器。它不完全是“规范”,因为它使用Qt工具包和boost.python,因为它仅用于这个应用程序。但我认为你会发现它包含一些你可以在你的程序中使用的有用的小块。

https://svn.janelia.org/penglab/projects/vaa3d/trunk/experimental/brunsc/python_console/PythonInterpreter.h

https://svn.janelia.org/penglab/projects/vaa3d/trunk/experimental/brunsc/python_console/PythonInterpreter.cpp