可以将编译后的 .pyc 文件反编译为 .py 文件吗?

253 投票
10 回答
514895 浏览
提问于 2025-04-16 13:35

从一个.py文件生成的.pyc文件中,能不能提取一些信息呢?

10 个回答

33

是的

我使用了uncompyle6这个工具来反编译代码(它甚至支持最新的Python 3.8.0版本):

uncompyle6 utils.cpython-38.pyc > utils.py

原始的Python代码和反编译后的Python代码对比起来是这样的:

pyc uncompile utils

所以你可以看到,几乎是一样的,反编译的效果非常好

38

你可以试试 Easy Python Decompiler。这个工具是基于 Decompyle++ 和 Uncompyle2 制作的。它可以反编译 Python 1.0 到 3.3 版本的代码。

注意:我是这个工具的作者。

228

简介

Python 的反编译是个难题,尤其是对于最近的 3.x 版本。这就是为什么有很多工具,但它们都有一些限制和bug。

不过,Python 2.7 和早期的 3.x 版本反编译效果还不错,哪怕只能部分恢复代码,总比什么都没好。

可以尝试的工具

Uncompyle6 这个工具可以用,虽然有些bug,但对 Python 3.8 及以下版本效果不错,对 2.7 也很友好。

  • 推荐的选择,因为它旨在统一之前的版本,并专注于自动化单元测试。
  • uncompyle6 的 GitHub 页面 有更多详细信息。
  • 对早期的 3.x 版本效果最好,不太适合 3.7 及以上版本。

如果这个不行,接下来可以试试这个工具,特别是对于 Python 3.7 及以上版本:

  • decompyle3 是 Uncompyle6 的一个分支,由同一个作者开发,应该对 3.7 和 3.8 的支持更好。
  • 注意:这个 decompyle3 包来自 rocky/decompile3 仓库,拼写不同但意思相同。

如果你还是遇到问题,可以查看 uncompyle6decompyle3 的 README 文件,里面有链接到其他可能对你的代码更有效的工具。

限制

你可以恢复代码,包括变量名和文档字符串,但评论内容是无法恢复的。

有些代码可能无法成功反编译,特别是那些控制流比较复杂的代码,或者是更新的 Python 3.x 版本。这是因为这些反编译工具存在bug,而 Python 的字节码随着时间的推移也发生了变化。

支持最近的 Python 版本

无论是 uncompyle6 还是 decompyle3 都不支持 Python 3.9 或更高版本,对 3.7 及以上版本的支持也有限。

Python 的新优化让反编译变得更加困难,而且这两个项目在代码贡献和赞助方面都比较缺乏。

你可以做的事情来帮助:

  • 在 GitHub 上为这些项目提交bug报告,记得先检查一下是否有类似的问题 - 这两个项目都在多个 Python 版本上运行单元测试。
  • 赞助这些项目,特别是如果它们对你有帮助的话。

防止未来代码丢失

经常进行 Git 提交或备份显然是个好主意。

一些编辑器/集成开发环境(IDE)有功能可以帮助恢复已删除的文件,即使这些文件没有提交到 Git。可以查看 这个回答,里面有一些可能适用于你的编辑器或 IDE 的建议,包括 VS Code 和 JetBrains 的 IDE,如 PyCharm、GoLand 和 IntelliJ。

撰写回答