Est-il possible de décompiler un fichier .pyc compilé en un fichier .py?

178

Est-il possible d'obtenir des informations du fichier .pyc généré à partir d'un fichier .py?

Howard
la source

Réponses:

169

Uncompyle6 fonctionne pour Python 3.x et 2.7 - option recommandée car c'est l'outil le plus récent, visant à unifier les fourches précédentes et se concentrant sur les tests unitaires automatisés. La page GitHub contient plus de détails.

  • si vous utilisez Python 3.7+, vous pouvez également essayer decompile3 , un fork d'Uncompyle6 se concentrant sur 3.7 et plus.
  • soulevez des problèmes GitHub sur ces projets si nécessaire - les deux exécutent des suites de tests unitaires sur une gamme de versions de Python

L'ancien Uncompyle2 ne prend en charge que Python 2.7. Cela a bien fonctionné pour moi il y a quelque temps pour décompiler le bytecode .pyc en .py, alors que unpyclib s'est écrasé avec une exception.

Avec tous ces outils, vous récupérez votre code avec les noms de variables, mais sans les commentaires.

RichVel
la source
7
Merci beaucoup. J'avais accidentellement supprimé mon fichier .py au lieu de .pyc. Cela m'a évité d'avoir à le réécrire à partir de zéro.
avmohan
21
Pour ceux d'entre vous ici parce que vous avez accidentellement supprimé le mauvais fichier, je recommande fortement le contrôle de source!
Andrew Palmer
30

Oui, vous pouvez l'obtenir avec unpyclibqui peut être trouvé sur pypi .

$ pip install unpyclib

Ensuite, vous pouvez décompiler votre fichier .pyc

$ python -m unpyclib.application -Dq path/to/file.pyc
Pokoutnik
la source
20
J'ai essayé cela et il s'est écrasé avec une exception, sur un tout petit fichier sans code complexe (Django settings.py) - uncompyle2 a bien fonctionné à la place. -1 pour cette raison.
RichVel
9
Il s'est écrasé dans Python 3.6 dans lib \ site-packages \ unpyclib \ applcation.py avec print __copyright- pourquoi utilise-t-il la version Python 2.7 de printsans parenthèses?
David Ching
1
unpyclibLa première et la dernière version de @DavidChing datent de 2009 , on peut dire que c'est un programme uniquement Python 2.
Boris
28

Vous pouvez essayer Easy Python Decompiler . Il est basé sur Decompyle ++ et Uncompyle2. Il prend en charge la décompilation des versions 1.0-3.3 de python

Remarque: je suis l'auteur de l'outil ci-dessus.

Codeurs extrêmes
la source
5
Il fait son travail. Bon travail. BTW, avez-vous écrit cet outil en python?
shinzou
1
A bien fonctionné pour moi (glisser-déposer facile). Il est vrai qu'une distribution Linux serait bien, mais ce n'est pas si difficile d'ouvrir une boîte Windows.
Brian Jackson
Dernière sortie en 2015 et ressemble à une source fermée?
Boris
13

Decompyle ++ (pycdc) était le seul qui a fonctionné pour moi: https://github.com/zrax/pycdc

a été suggéré dans Decompile Python 2.7 .pyc

Kenneth Hoste
la source
1
Et cela a fonctionné pour moi pour le code qui a été compilé avec Python 2.6!
David Mertens
4

Oui .

J'utilise uncompyle6 decompile (supporte même le dernier Python 3.8.0):

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

et le python d'origine et le python décompilé comparant ressemblent à ceci:

pyc décompiler les utilitaires

donc vous pouvez voir, presque le même effet de décompilation est TRÈS BON .

crifan
la source
3

Oui c'est possible.

Il existe un décompilateur Python (.PYC) open-source parfait, appelé Decompyle ++ https://github.com/zrax/pycdc/

Decompyle ++ vise à traduire le code d'octet Python compilé en code source Python valide et lisible par l'homme. Alors que d'autres projets ont atteint cet objectif avec un succès varié, Decompyle ++ est unique en ce sens qu'il cherche à prendre en charge le byte-code de n'importe quelle version de Python.

Andrew Rukin
la source
2
Bien que pycdc soit bon, ce n'est pas parfait. Si vous regardez github.com/zrax/pycdc/issues, il y a plus de 50 types de problèmes de décompilation. Ceci est cependant réparti sur les 16 versions environ de python, et le langage et le code ont radicalement changé. Il se peut que pour les choses que vous avez essayées, vous n'ayez pas trouvé de problème. Cependant, à mon avis, pour classer quelque chose comme "parfait", il faudrait prendre par exemple toute la bibliothèque Python pour chaque version, la décompiler et lui faire passer ses propres tests correctement. Aucun décompilateur ne peut encore faire cela.
rocky
1

Installer à l'aide de pip install pycompyle6

pycompyle6 nomfichier.pyc

Banik Kuntal
la source