2013-03-15 112 views
4

让我们假设我们有一个Python字符串(不是一个文件,一个字符串,没有文件)python:如何从代码对象获取源代码?

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

好吗?现在,我们编译字符串成片的蟒蛇字节码

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

现在的问题:我如何从二进制搞定,假如我不知道TheString,代表原始字符串对象的字符串?

不久:什么是相反的编译功能()?

+1

http://stackoverflow.com/questions/1149513/exploring-and-decompiling-python-bytecode – 2013-03-15 12:30:53

回答

11

没有源代码,您只能近似代码。您可以拆卸编译的字节码与dis module,然后重建的源代码作为近似:

>>> 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中。

unpycuncompyle2项目做到这一点;反编译python字节码并从中重新构建Python代码。