Python: 如何从代码对象中获取源代码?

6

假设我们有一个Python字符串(不是文件,是字符串,没有文件)。

TheString = "k=abs(x)+y"

好的,现在我们将字符串编译成一段Python字节码

Binary = compile( TheString , "<string>" , "exec" )

现在的问题是:如果我不知道TheString,我如何从二进制中获取表示原始字符串对象的字符串?

简而言之:与compile()相反的函数是什么?


1
https://dev59.com/Y3M_5IYBdhLWcg3w9oWG - Samuele Mattiuzzo
1个回答

16

如果没有源代码,你只能大致了解代码。你可以使用dis模块对编译后的字节码进行反汇编,然后重构源代码以作为近似结果:

>>> import dis
>>> TheString = "k=abs(x)+y"
>>> Binary = compile( TheString , "<string>" , "exec" )
>>> dis.dis(Binary)
  1           0 LOAD_NAME                0 (abs)
              3 LOAD_NAME                1 (x)
              6 CALL_FUNCTION            1
              9 LOAD_NAME                2 (y)
             12 BINARY_ADD          
             13 STORE_NAME               3 (k)
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        

从反汇编中我们可以看到有1行,其中调用了一个名为abs()的函数,它带有一个名为x的参数。结果添加到另一个名为y的名称中,并将结果存储在k中。
uncompile6这样的项目(构建在许多其他人的工作之上)会执行此操作:反编译Python字节码并从中重构Python代码。

1
unpycuncompyle2看起来都很陈旧(分别为7年和9年); 您知道是否有什么更现代的替代品?同时也支持Python3? -- 算了,我找到了:https://pypi.python.org/pypi/uncompyle6 - exhuma
@exhuma:这个回答也已经相当老了,已经有五年时间了;-) 是的,各种反编译软件包多年来一直在变化和演变,我会进行更新的。 - Martijn Pieters
@exhuma - 这个答案提到了Uncompyle6: - RichVel

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