从Python AST生成.pyc文件?

13

我该如何从Python AST生成一个.pyc文件,以便我可以从Python中导入该文件?

我使用了compile来创建代码对象,然后将co_code属性写入文件,但当我尝试从Python导入文件时,出现了ImportError:Bad magic number in output.pyc错误。

2个回答

19

这个解决方案可以从py_compile模块进行适应:

import marshal
import py_compile
import time
import ast

codeobject = compile(ast.parse('print "Hello World"'), '<string>', 'exec')

with open('output.pyc', 'wb') as fc:
    fc.write('\0\0\0\0')
    py_compile.wr_long(fc, long(time.time()))
    marshal.dump(codeobject, fc)
    fc.flush()
    fc.seek(0, 0)
    fc.write(py_compile.MAGIC)


6
这正是我一直在寻找的。但我发现,只需先写入py_compile.MAGIC,而不是\0\0\0\0,就可以避免回到开头并重写那4个字节。 - Matthew

2

compile 是 Python 2.x 和 Python 3.x 的标准函数。然而,你会发现2.x和3.x之间的AST表示形式有很大的不同,所以请做好心理准备。


我理解返回的代码对象中的 co_code 属性就是我要找的字节码,对吗? - exupero
很有可能。我所做的唯一事情就是将代码对象传递给execeval,我没有直接检查字节码。 - Greg Hewgill
我根据这个答案学到的内容,编辑了问题以使其更具体。 - exupero
2
我认为“代码对象”只是编译模块文件中的一部分。创建编译模块文件的方法之一是从Python源代码开始。如果您感兴趣,我有一些可以从AST创建源代码的代码。 - Greg Hewgill
的确,您是正确的:似乎有许多其他信息。 - exupero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接