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

178

Ist es möglich, Informationen aus der .pyc-Datei abzurufen, die aus einer .py-Datei generiert wird?

Howard
quelle

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.

RichVel
quelle
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
Pokutnik
quelle
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.

Extreme Codierer
quelle
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.

Andrew Rukin
quelle
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 .

Crifan
quelle
1

Installation mit pip install pycompyle6

pycompyle6 filename.pyc

Banik Kuntal
quelle