Python:如何从代码对象获取源代码?[重复]

发布于 2021-01-29 14:10:47

这个问题已经在这里有了答案

探索和反编译python字节码[关闭] (6个答案)

7年前关闭。

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

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

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

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

现在的问题是:假设我不知道TheString(代表原始字符串对象的字符串),我怎么能从Binary获得?

很快:与compile()相反的函数是什么?

关注者
0
被浏览
113
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    没有源代码,您只能近似代码。您可以使用模块 反汇编
    已编译的字节码,然后将源代码重建为近似值: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代码。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看