【问题标题】:Is it possible to decompile a compiled .pyc file into a .py file?是否可以将已编译的 .pyc 文件反编译为 .py 文件?
【发布时间】:2011-07-14 07:43:18
【问题描述】:

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

【问题讨论】:

    标签: python decompiling pyc compiled


    【解决方案1】:

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

    • 如果您使用 Python 3.7+,也可以尝试 decompile3,这是 Uncompyle6 的一个分支,专注于 3.7 及更高版本。
    • 如果需要,请在这些项目上提出 GitHub 问题 - 两者都在一系列 Python 版本上运行单元测试套件

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

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

    【讨论】:

    • 非常感谢。我不小心删除了我的 .py 文件而不是 .pyc。这使我不必从头开始重写它。
    • 对于那些因为不小心删除了错误的文件而来到这里的人,我强烈推荐源代码管理!
    • ^ 如果您使用的是 PyCharm,您可以在“项目”窗格中右键单击您的文件/文件夹,然后转到“本地历史记录”>“显示历史记录”以恢复更改。救生员。
    • uncompyle6 也可通过decompiler.com在线获得
    • 对于 VS Code 用户,没有像 PyCharm 这样的内置本地历史记录,但 some plugins exist 可以做同样的事情。
    【解决方案2】:

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

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

    【讨论】:

    • 它完成了它的工作。干得好。 BTW,这个工具是你用python写的吗?
    • 对我来说效果很好(轻松拖放)。确实,Linux 发行版会很好,但打开 Windows 框并不是那么难。
    • 2015 年最后一次发布,看起来是闭源的?
    【解决方案3】:

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

    $ pip install unpyclib
    

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

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

    【讨论】:

    • 我试过了,但它在一个没有复杂代码的小文件(Django settings.py)上崩溃了一个异常 - uncompyle2 工作正常。出于这个原因-1。
    • 它在 Python 3.6 中的 lib\site-packages\unpyclib\applcation.py 中使用print __copyright 崩溃——为什么它使用不带括号的print 的 Python 2.7 版本?
    • @DavidChing unpyclib 的第一个和最后一个版本was in 2009,可以肯定地说这是一个仅限 Python 2 的程序。
    【解决方案4】:

    是的

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

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

    原始python和反编译python对比如下:

    所以你可以看到,几乎一样,反编译效果是VERY GOOD

    【讨论】:

    • 这里有同样的经历。 uncompyle6 太不可思议了。
    【解决方案5】:

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

    建议在Decompile Python 2.7 .pyc

    【讨论】:

    • 这适用于我使用 Python 2.6 编译的代码!
    【解决方案6】:

    是的,有可能。

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

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

    【讨论】:

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

    安装使用 pip install pycompyle6

    pycompyle6 文件名.pyc

    【讨论】:

      【解决方案8】:

      我已经为此工作了几个小时,终于有了使用 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 文件夹中
      【解决方案9】:

      如果您需要反编译 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
      猜你喜欢
      • 2019-03-19
      • 2011-12-30
      • 2021-06-07
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多