有没有办法程序生成Python字节码?
我想玩玩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,但考虑到作者的声誉,我相信这个工具值得一试!