有没有办法程序生成Python字节码?

12 投票
6 回答
5137 浏览
提问于 2025-04-15 14:37

我想玩玩Python解释器,试着创建一个小型的领域特定语言(DSL)。有没有什么模块可以让我实现类似于这个理论代码的功能(像LINQ表达式树那样)?

expression_tree = Function(
    Print(
        String('Hello world!')
    )
 )
compile_to_bytecode(expression_tree)

还是说直接生成Python源代码会更简单一些?使用C、SWIG或者Cython会不会让这个过程更容易呢?

6 个回答

2

生成Python代码并运行起来其实更简单。如果你这样做的话,调试起来也会更容易,因为调试器可以显示实际的源代码。你可以看看Malte Borch在七月的Python杂志上写的文章,他在里面讨论了这个话题,还有其他一些内容。

5

在Python 2.X中,通常你会使用一个叫做 compiler模块,里面有个子模块叫 ast(不过要注意,这个模块从2.6版本开始就不再推荐使用了)。而在Python 3.X中,你只需要用 ast 就可以了。

这两个模块都有一个 compile() 函数,可以把源代码或抽象语法树(AST)转换成“可以被 exec 语句或 eval() 执行的代码对象”。

13

通过使用 ast(抽象语法树)并把树编译成字节码,正如其他答案所提到的,这可能是最简单的方法;生成源代码并编译这些源代码,效果也差不多。

不过,如果你想了解更底层的方法,可以看看这个页面里的链接;我发现byteplay特别有用(目前不支持2.6和3.*版本,只能在2.4或2.5上使用,不过我觉得让它支持2.6应该不难,相关讨论可以在它的跟踪器里找到)。我没有使用Phil Eby的类似工具BytecodeAssembler,但考虑到作者的声誉,我相信这个工具值得一试!

撰写回答