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

python:如何从代码对象获取源代码?,python,decompiling,Python,Decompiling,假设我们有一个python字符串(不是一个文件,一个字符串,没有文件) 好吗?现在我们将字符串编译成一段python字节码 Binary = compile( TheString , "<string>" , "exec" ) Binary=compile(字符串“,”exec”) 现在的问题是:假设我不知道字符串,一个代表原始字符串对象的字符串,如何从二进制中获取 简而言之:compile()的相反函数是什么?如果没有源代码,您只能大致了解代码。您可以使用反汇编编译的字节码,然

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

好吗?现在我们将字符串编译成一段python字节码

Binary = compile( TheString , "<string>" , "exec" )
Binary=compile(字符串“,”exec”)
现在的问题是:假设我不知道字符串,一个代表原始字符串对象的字符串,如何从二进制中获取


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

如果没有源代码,您只能大致了解代码。您可以使用反汇编编译的字节码,然后将源代码重建为近似值:

>>> 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        
导入dis >>>字符串=“k=abs(x)+y” >>>二进制=编译(字符串“,”exec”) >>>dis.dis(二进制) 1 0加载名称0(abs) 3加载单元名称1(x) 6调用函数1 9加载单元名称2(y) 12二进制加法 13店铺名称3(k) 16负载常数0(无) 19返回值 从反汇编中,我们可以看到有一行,其中一个名为
abs()
的函数正在被一个名为
x
的参数调用。结果被添加到另一个名称
y
,结果存储在
k


像(建筑)这样的项目就是这样做的;反编译python字节码并从中重构python代码

unpyc
uncompyle2
分别看起来非常老(7岁和9岁)。你知道还有什么。。。现代的?哪个还支持Python3?--没有关系。。找到了:@exhuma:这个答案也很古老,已经5年了,还在计算;-)是的,这些年来各种反编译包一直在变形和变化,我会更新。@exhuma-提到Uncompyle6:
>>> 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