当前位置: 首页 > 面试题库 >

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

程禄
2023-03-14
问题内容

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

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

7年前关闭。

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

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

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

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

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

很快:与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

从反汇编中,我们可以看到有1行,其中使用一个名为的abs()参数调用了名为的函数x。结果将添加到另一个名称中y,并将结果存储在中k

像这样的项目uncompile6(建立在许多其他人的工作之上)就是这样做的;反编译python字节码并从中重建Python代码。



 类似资料:
  • 我想安装Python 3.4.6,但它只有源代码格式。 Python官方网站上的安装选项是Gzip'd源tarball和XZ压缩源tarball。我以前从未以这种方式安装过Python,所以我不知道该怎么办。我如何安装Python和我下载什么文件? https://www.python.org/downloads/release/python-346/

  • 我认为两个线程同时调用take方法,只有一个线程可以成功地获得锁,而另一个线程将在以下行等待锁:这是take的源代码: 但是,当我对这两个线程进行线程转储时,我发现两个线程都成功锁定,并且在线等待:(因为队列为空)这是线程转储: “test-thread-18”#6357守护进程prio=5 os_prio=0 tid=0x00007f8f54543000 nid=0x58ef在条件[0x0000

  • <?php $http = HttpRequest::newSession(); $response = $http->get('http://www.baidu.com/'); $content = $response->body(); // 网页源码

  • 问题内容: 假设我有如下定义的Python函数: 我可以使用获取函数的名称。如上所述,我如何以编程方式获取其源代码? 问题答案: 如果该功能来自文件系统上可用的源文件,则可能会有帮助: 如果foo定义为: 然后: 返回值: 但是我相信,如果函数是从字符串,流中编译的,或者是从编译文件中导入的,那么您将无法检索其源代码。

  • 我们采用GitLab作为项目代码释放平台,所有仓库源码及更新获取都需通过GitLab同步。 gitlab代码入口为:https://gitlab.com/nationalchip/vsp_sdk 一、注册GitLab账号 GitLab登录链接 GitLab账号注册可能需要翻墙,所以不能打开注册链接的,我们建议通过GitHab账号登录。 GitHub注册链接 没有GitHub账号的话,先通过下面链接

  • 参考快速上手指南的代码获取章节: gitlab代码获取章节