ChatGPT解决这个技术问题 Extra ChatGPT

是否可以将已编译的 .pyc 文件反编译为 .py 文件?

是否可以从 .py 文件生成的 .pyc 文件中获取一些信息?


R
RichVel

Uncompyle6 适用于 Python 3.x 和 2.7 - 推荐选项,因为它是最新的工具,旨在统一早期的分支并专注于自动化单元测试。 GitHub page 有更多详细信息。

如果您使用 Python 3.7+,您还可以尝试 decompyle3,它是 Uncompyle6 的一个分支,专注于 3.7 及更高版本。

如果需要,请在这些项目上提出 GitHub 问题 - 两者都在一系列 Python 版本上运行单元测试套件。

使用这些工具,您可以获取包含变量名和文档字符串的代码,但没有注释。

旧版 Uncompyle2 仅支持 Python 2.7。前段时间这对我来说很有效,可以将 .pyc 字节码反编译为 .py,而 unpyclib 因异常而崩溃。

将来防止这种情况

有关可能在您的编辑器或 IDE(包括 VS Code)中起作用的一些提示,请参阅 this answer


非常感谢。我不小心删除了我的 .py 文件而不是 .pyc。这使我不必从头开始重写它。
对于那些因为不小心删除了错误的文件而来到这里的人,我强烈推荐源代码管理!
^ 如果您使用的是 PyCharm,您可以在“项目”窗格中右键单击您的文件/文件夹,然后转到“本地历史记录”>“显示历史记录”以恢复更改。救生员。
uncompyle6 也可在 decompiler.com 上在线获取
我添加了一个指向 new answer 的链接,该链接解释了如何在某些编辑器和 IDE 中取消删除文件。
E
Extreme Coders

您可以尝试Easy Python Decompiler。它基于 Decompyle++ 和 Uncompyle2。它支持反编译python 1.0-3.3版本

注意:我是上述工具的作者。


它完成了它的工作。干得好。顺便说一句,你是用python写的这个工具吗?
对我来说效果很好(轻松拖放)。确实,Linux 发行版会很好,但打开 Windows 框并不是那么难。
最后一次发布于 2015 年,看起来它是封闭源代码?
@MacGyver 对不起,但现在你不能信任链接 sourceforge ,即使它是一个众所周知的域。答案来自 2014 年,当时 https 不是强制性的。是的,sourceforge 的记录确实已经消失了,我很久以前就停止使用 sourceforge。
不用担心。不是诋毁你。我只是不想让其他人获得特洛伊木马、恶意软件、间谍软件、病毒或任何其他互联网轻罪。 :)
P
Pokutnik

是的,您可以通过 pypi 上的 unpyclib 获得它。

$ pip install unpyclib

比你可以反编译你的 .pyc 文件

$ python -m unpyclib.application -Dq path/to/file.pyc

我尝试了这个,它在一个没有复杂代码的相当小的文件(Django settings.py)上崩溃了一个异常 - uncompyle2 工作得很好。 -1 出于这个原因。
它在带有 print __copyright 的 lib\site-packages\unpyclib\applcation.py 中的 Python 3.6 中崩溃——为什么它使用不带括号的 Python 2.7 版本的 print
@DavidChing unpyclib 的第一个和最后一个版本 was in 2009,可以肯定地说它是仅 Python 2 的程序。
c
crifan

是的。

我使用 uncompyle6 反编译(甚至支持最新的 Python 3.8.0):

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

原始 python 和反编译 python 比较看起来像这样:

https://i.stack.imgur.com/Zw0aN.jpg

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


在这里同样的经历。 uncompyle6 令人难以置信。
C
Community

Decompyle++ (pycdc) 是唯一对我有用的:https://github.com/zrax/pycdc

Decompile Python 2.7 .pyc 中建议


这对我用 Python 2.6 编译的代码有用!
D
Dharman

我已经为此工作了几个小时,终于有了使用 Decompyle++ 的解决方案:

访问 https://cmake.org/download/ 并安装 CMake。

访问 https://github.com/zrax/pycdc 并获取此 repo 的副本:pycdc-master。

将 C:\Program Files\CMake\bin 添加到 PATH 下的系统环境变量中。

我建议将您的 pycdc-master 文件夹放入另一个文件夹,例如 anotherFolder

现在您可以在命令行中运行这些命令:

cd anotherFolder 进入包含 pycdc-master 的文件夹。

cmake pycdc-master

cd ../ 上一级目录,

然后: cmake --build anotherFolder

pycdc.exe 将在 anotherFolder\Debug 中。

在控制台中执行类似 pycdc.exe onlyhopeofgettingmycodeback.pyc 的操作,它会打印出源代码。我有 Python 3.9.6 源代码,但没有其他工作。


通常您在 repo 中创建 build 文件夹,然后在您调用 cmake ..build 文件夹中创建
G
G_M

对的,这是可能的。

有一个完美的开源 Python (.PYC) 反编译器,称为 Decompyle++ https://github.com/zrax/pycdc/

Decompyle++ 旨在将编译后的 Python 字节码转换回有效且人类可读的 Python 源代码。虽然其他项目已经取得了不同程度的成功,但 Decompyle++ 的独特之处在于它寻求支持来自任何版本的 Python 的字节码。


虽然 pycdc 很好,但它并不完美。如果您查看 github.com/zrax/pycdc/issues,就会发现它在反编译中存在 50 多种不同类型的问题。然而,这分布在 16 个左右的 python 版本中,语言和代码都发生了巨大变化。可能是你尝试过的事情都没有发现问题。但是,在我看来,要将某些东西归类为“完美”,就必须说每个版本的整个 Python 库,反编译它,并让它正确地通过自己的测试。还没有反编译器可以做到这一点。
B
Banik Kuntal

使用 pip install pycompyle6 安装

pycompyle6 文件名.pyc


C
CLipp

如果您需要反编译 pyc 但安装了 python 3.9,您可以强制 uncompyle6 运行。它并不完美,但它确实有效。只需编辑 site-packages\uncompyle6\bin\uncompile.py

def main_bin():
if not (sys.version_info[0:2] in ((2, 6), (2, 7), (3, 0),
                                  (3, 1), (3, 2), (3, 3),
                                  (3, 4), (3, 5), (3, 6),
                                  (3, 7), (3, 8), (3, 9)

只需以与其他版本相同的格式添加您已安装的版本并保存。它至少会运行。


它不会反编译用python3.9制作的pyc