可以将编译后的 .pyc 文件反编译为 .py 文件吗?
从一个.py文件生成的.pyc文件中,能不能提取一些信息呢?
10 个回答
是的。
我使用了uncompyle6这个工具来反编译代码(它甚至支持最新的Python 3.8.0版本):
uncompyle6 utils.cpython-38.pyc > utils.py
原始的Python代码和反编译后的Python代码对比起来是这样的:
所以你可以看到,几乎是一样的,反编译的效果非常好。
你可以试试 Easy Python Decompiler。这个工具是基于 Decompyle++ 和 Uncompyle2 制作的。它可以反编译 Python 1.0 到 3.3 版本的代码。
注意:我是这个工具的作者。
简介
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
仓库,拼写不同但意思相同。
如果你还是遇到问题,可以查看 uncompyle6
和 decompyle3
的 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。