¿Es posible descompilar un archivo compilado .pyc en un archivo .py?

Respuestas:

169

Uncompyle6 funciona para Python 3.xy 2.7: opción recomendada, ya que es la herramienta más reciente, con el objetivo de unificar las horquillas anteriores y centrarse en las pruebas unitarias automatizadas. La página de GitHub tiene más detalles.

  • si usa Python 3.7+, también puede intentar descompilar3 , una bifurcación de Uncompyle6 que se enfoca en 3.7 y superior.
  • plantee problemas de GitHub en estos proyectos si es necesario: ambos ejecutan suites de pruebas unitarias en una variedad de versiones de Python

El Uncompyle2 anterior solo es compatible con Python 2.7. Esto funcionó bien para mí hace algún tiempo descompilar el bytecode .pyc en .py, mientras que unpyclib se bloqueó con una excepción.

Con todas estas herramientas, recupera su código, incluidos los nombres de variables, pero sin los comentarios.

RichVel
fuente
77
Muchas gracias. Accidentalmente eliminé mi archivo .py en lugar de .pyc. Esto me salvó de tener que reescribirlo desde cero.
avmohan
21
Para aquellos de ustedes aquí porque has borrado accidentalmente el archivo equivocado, yo altamente recomiendo control de la fuente!
Andrew Palmer
30

Sí, puede obtenerlo con unpyclibeso se puede encontrar en pypi .

$ pip install unpyclib

Entonces puedes descompilar tu archivo .pyc

$ python -m unpyclib.application -Dq path/to/file.pyc
Pokutnik
fuente
20
Intenté esto y se bloqueó con una excepción, en un archivo bastante pequeño sin código complejo (Django settings.py) - Unpypy2 funcionó bien en su lugar. -1 por ese motivo.
RichVel
9
Se bloqueó en Python 3.6 en lib \ site-packages \ unpyclib \ applcation.py con print __copyright: ¿por qué está usando la versión Python 2.7 printsin paréntesis?
David Ching
1
unpyclibEl primer y último lanzamiento de @DavidChing fue en 2009 , es seguro decir que es un programa exclusivo de Python 2.
Boris
28

Puedes probar Easy Python Decompiler . Está basado en Decompyle ++ y Uncompyle2. Es compatible con la descomposición de las versiones de Python 1.0-3.3

Nota: Soy el autor de la herramienta anterior.

Codificadores extremos
fuente
55
Hace su trabajo Buen trabajo. Por cierto, ¿escribiste esta herramienta en Python?
Shinzou
1
Me funcionó bien (arrastrar y soltar fácilmente). Es cierto que una distribución de Linux sería agradable, pero no es tan difícil abrir una ventana de Windows.
Brian Jackson
Último lanzamiento en 2015 y parece que es de código cerrado?
Boris
4

.

Yo uso uncompyle6 descompilar (incluso soporta el nuevo Python 3.8.0):

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

y la comparación de Python de origen y Python descompilado se ve así:

Pyc no compila utilidades

para que pueda ver, casi lo mismo, el efecto de descompilación es MUY BUENO .

crifan
fuente
3

Sí, es posible.

Hay un descompilador perfecto de código abierto Python (.PYC), llamado Decompyle ++ https://github.com/zrax/pycdc/

Decompyle ++ tiene como objetivo traducir el código de byte compilado de Python nuevamente en un código fuente Python válido y legible por humanos. Mientras que otros proyectos han logrado esto con un éxito variado, Decompyle ++ es único en el sentido de que busca admitir el código de bytes de cualquier versión de Python.

Andrew Rukin
fuente
2
Si bien pycdc es bueno, no es perfecto. Si observa github.com/zrax/pycdc/issues, hay más de 50 tipos individuales de problemas que tiene en la descompilación. Sin embargo, esto se extiende a lo largo de las 16 versiones de Python, y tanto el lenguaje como el código han cambiado drásticamente. Puede ser que por las cosas que ha intentado no haya podido encontrar un problema. Sin embargo, en mi opinión, para clasificar algo como "perfecto", habría que tomar por ejemplo toda la biblioteca de Python para cada versión, descompilarla y hacer que pase sus propias pruebas correctamente. Ningún descompilador puede hacer eso todavía.
rocoso el
1

Instalar usando pip install pycompyle6

pycompyle6 filename.pyc

Banik Kuntal
fuente