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

7 投票
1 回答
10821 浏览
提问于 2025-04-17 19:12

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

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

明白了吗?现在我们把这个字符串编译成一段Python字节码

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

现在问题来了:如果我不知道这个字符串的内容,怎么从二进制数据中得到一个表示原始字符串对象的字符串呢?

简单来说:有什么函数是compile()的反向操作?

1 个回答

17

没有源代码的话,你只能大致猜测代码的样子。你可以用 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 代码。

撰写回答