假设我们有一个Python字符串(不是文件,是字符串,没有文件)。
TheString = "k=abs(x)+y"
好的,现在我们将字符串编译成一段Python字节码
Binary = compile( TheString , "<string>" , "exec" )
现在的问题是:如果我不知道TheString,我如何从二进制中获取表示原始字符串对象的字符串?
简而言之:与compile()相反的函数是什么?
假设我们有一个Python字符串(不是文件,是字符串,没有文件)。
TheString = "k=abs(x)+y"
好的,现在我们将字符串编译成一段Python字节码
Binary = compile( TheString , "<string>" , "exec" )
现在的问题是:如果我不知道TheString,我如何从二进制中获取表示原始字符串对象的字符串?
简而言之:与compile()相反的函数是什么?
如果没有源代码,你只能大致了解代码。你可以使用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
abs()
的函数,它带有一个名为x
的参数。结果添加到另一个名为y
的名称中,并将结果存储在k
中。uncompile6
这样的项目(构建在许多其他人的工作之上)会执行此操作:反编译Python字节码并从中重构Python代码。unpyc
和uncompyle2
看起来都很陈旧(分别为7年和9年); 您知道是否有什么更现代的替代品?同时也支持Python3? -- 算了,我找到了:https://pypi.python.org/pypi/uncompyle6 - exhuma