Man hat ein altes Pythonprogramm nur noch in Bytecode (Dateien mit der Endung .pyc) vorliegen würde aber gerne noch etwas daran ändern. Was nun? Alles neu schreiben? Nein viel zu aufwändig. Aber es gibt eine Rettung….in Form der unpyclib Bibliothek von Dmitri Kornev. Diese kann man einfach über pip herunterladen.
pip install unpyclib
Dann lassen sich .pyc Dateien mit folgendem Aufruf wieder zurückübersetzen:
python -m unpyclib.application -Dq path/to/file.pyc
Wenn man jetzt aber ein Projekt hat, welches aus mehr als nur einer Datei besteht wird das über die Kommandozeile lästig.
Aus diesem Grund habe ich folgendes Script geschrieben, welches alle .pyc Dateien in einem Verzeichnis und dessen Unterverzeichnissen wieder zurück übersetzt.
import os import sys import unpyclib.parse import unpyclib.disasm import unpyclib.decompile rootdir = sys.argv[1] for dirPath, subFolders, files in os.walk(rootdir): for filename in files: if filename.endswith(".pyc"): bytecodefile = os.path.join(dirPath, filename) sourcefile = bytecodefile[:-1] print bytecodefile if os.path.isfile(sourcefile): print "skipped" else: print "-> " + sourcefile try: parser = unpyclib.parse.Parser(bytecodefile, verboseDisasm=False, xrefDisasm=False) disassembler = unpyclib.disasm.Disassembler(parser.co) optimizingDisassembler = unpyclib.disasm.Disassembler(parser.co, optimizeJumps=True) decompiler = unpyclib.decompile.Decompiler(optimizingDisassembler, False) f = open(sourcefile, "w") f.write(decompiler.decompile()) f.close() except (unpyclib.parse.ParseErrorException, unpyclib.parse.IOErrorException, unpyclib.parse.BadFirstObjectException), p: print p