Ist es möglich, eine kompilierte .pyc-Datei in eine .py-Datei zu dekompilieren?


Antworten:


169

Uncompyle6 funktioniert für Python 3.x und 2.7 - empfohlene Option als neuestes Tool, mit dem Ziel, frühere Gabeln zu vereinheitlichen und sich auf automatisierte Komponententests zu konzentrieren. Die GitHub-Seite enthält weitere Details.

  • wenn Sie Python verwenden 3.7+, können Sie auch versuchen decompile3 , eine Gabel von Uncompyle6 Fokussierung auf 3,7 und höher.
  • Bei Bedarf treten bei diesen Projekten GitHub-Probleme auf. Beide führen Unit-Test-Suites für eine Reihe von Python-Versionen aus

Der ältere Uncompyle2 unterstützt nur Python 2.7. Dies hat vor einiger Zeit für mich gut funktioniert, um den .pyc-Bytecode in .py zu dekompilieren, während unpyclib mit einer Ausnahme abstürzte.

Mit all diesen Tools erhalten Sie Ihren Code einschließlich der Variablennamen zurück, jedoch ohne die Kommentare.


7
Vielen Dank. Ich hatte versehentlich meine .py-Datei anstelle von .pyc gelöscht. Dies ersparte mir, es von Grund auf neu schreiben zu müssen.
Avmohan

20
Für die von Ihnen hier , weil Sie versehentlich die falsche Datei gelöscht, ich sehr empfehlen Quelle Kontrolle!
Andrew Palmer

30

Ja, Sie können es damit bekommen unpyclib, finden Sie auf pypi .

$ pip install unpyclib

Dann können Sie Ihre .pyc-Datei dekompilieren

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

20
Ich habe es versucht und es stürzte mit einer Ausnahme ab, bei einer recht kleinen Datei ohne komplexen Code (Django settings.py) - uncompyle2 funktionierte stattdessen einwandfrei. -1 aus diesem Grund.
RichVel

9
Es stürzte in Python 3.6 in lib \ site-packages \ unpyclib \ applcation.py mit ab print __copyright- warum wird die Python 2.7-Version printohne Klammern verwendet?
David Ching

1
unpyclibDie erste und letzte Veröffentlichung von @DavidChing war im Jahr 2009 , man kann mit Sicherheit sagen, dass es sich nur um ein Python 2-Programm handelt.
Boris

28

Sie können Easy Python Decompiler ausprobieren . Es basiert auf Decompyle ++ und Uncompyle2. Es unterstützt das Dekompilieren von Python-Versionen 1.0-3.3

Hinweis: Ich bin der Autor des oben genannten Tools.


5
Es macht seinen Job. Gute Arbeit. Übrigens, haben Sie dieses Tool in Python geschrieben?
Shinzou

1
Hat bei mir gut funktioniert (einfaches Drag & Drop). Es ist wahr, dass eine Linux-Distribution nett wäre, aber es ist nicht so schwer, eine Windows-Box zu öffnen.
Brian Jackson

Letzte Veröffentlichung im Jahr 2015 und sieht aus wie es Closed Source ist?
Boris


3

Ja, es ist möglich.

Es gibt einen perfekten Open-Source-Python-Dekompiler (.PYC) namens Decompyle ++ https://github.com/zrax/pycdc/

Decompyle ++ zielt darauf ab, kompilierten Python-Bytecode wieder in gültigen und lesbaren Python-Quellcode zu übersetzen. Während andere Projekte dies mit unterschiedlichem Erfolg erreicht haben, ist Decompyle ++ insofern einzigartig, als es versucht, Bytecode aus jeder Version von Python zu unterstützen.


2
Pycdc ist zwar gut, aber nicht perfekt. Wenn Sie sich github.com/zrax/pycdc/issues ansehen, gibt es über 50 einzelne Arten von Problemen bei der Dekompilierung. Dies ist jedoch auf die rund 16 Python-Versionen verteilt, und sowohl die Sprache als auch der Code haben sich drastisch geändert. Es kann sein, dass Sie für die Dinge, die Sie ausprobiert haben, kein Problem gefunden haben. Um jedoch etwas als "perfekt" zu klassifizieren, müsste man meiner Meinung nach die gesamte Python-Bibliothek für jede Version sagen, dekompilieren und ihre eigenen Tests ordnungsgemäß bestehen lassen. Das kann noch kein Dekompiler.
Rocky

2

Ja .

Ich verwende uncompyle6 decompile (unterstütze sogar das neueste Python 3.8.0):

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

und der Vergleich von Ursprungspython und dekompiliertem Python sieht folgendermaßen aus:

pyc nicht kompilieren utils

Sie können also sehen, dass fast der gleiche Dekompilierungseffekt SEHR GUT ist .


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.