É possível descompilar um arquivo .pyc compilado em um arquivo .py?

178

É possível obter algumas informações do arquivo .pyc gerado a partir de um arquivo .py?

Howard
fonte

Respostas:

169

O Uncompyle6 funciona para o Python 3.xe 2.7 - opção recomendada, pois é a ferramenta mais recente, com o objetivo de unificar os garfos anteriores e se concentrar nos testes de unidade automatizados. A página do GitHub tem mais detalhes.

  • se você usa o Python 3.7+, também pode tentar descompilar3 , um fork do Uncompyle6 com foco no 3.7 e superior.
  • levantam problemas do GitHub nesses projetos, se necessário - ambos executam suítes de teste de unidade em várias versões do Python

O Uncompyle2 mais antigo suporta apenas Python 2.7. Isso funcionou bem para mim há algum tempo para descompilar o bytecode .pyc em .py, enquanto o unpyclib travou com uma exceção.

Com todas essas ferramentas, você recebe seu código de volta, incluindo nomes de variáveis, mas sem os comentários.

RichVel
fonte
7
Muito obrigado. Eu excluí acidentalmente meu arquivo .py em vez de .pyc. Isso me salvou de ter que reescrevê-lo do zero.
avmohan
20
Para aqueles de vocês aqui porque você acidentalmente apagou o arquivo errado, eu altamente recomendo o controle de origem!
Andrew Palmer
30

Sim, você pode obtê-lo com o unpyclibque pode ser encontrado no pypi .

$ pip install unpyclib

Do que você pode descompilar o arquivo .pyc

$ python -m unpyclib.application -Dq path/to/file.pyc
Pokutnik
fonte
20
Eu tentei isso e ele travou com uma exceção, em um arquivo muito pequeno, sem código complexo (Django settings.py) - o uncompyle2 funcionou bem. -1 por esse motivo.
RichVel 11/02
9
Ele travou no Python 3.6 em lib \ site-packages \ unpyclib \ applcation.py com print __copyright- por que está usando a versão Python 2.7 printsem parênteses?
David Ching
1
unpyclibA primeira e última versão do @DavidChing foi em 2009 , é seguro dizer que é apenas um programa em Python 2.
Boris
28

Você pode tentar o Easy Python Decompiler . É baseado em Decompyle ++ e Uncompyle2. Ele suporta a descompilação das versões python 1.0-3.3

Nota: Eu sou o autor da ferramenta acima.

Extreme Coders
fonte
5
Ele faz o seu trabalho. Bom trabalho. BTW, você escreveu esta ferramenta em python?
Shinzou
1
Funcionou bem para mim (fácil arrastar e soltar). É verdade que uma distribuição Linux seria legal, mas não é tão difícil abrir uma caixa de janelas.
Brian Jackson
Última versão em 2015 e parece que é de código fechado?
Boris
4

Sim .

Eu uso o decompile uncompyle6 (até mesmo suporte ao Python 3.8.0):

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

e o python de origem e o python descompilado comparando ficam assim:

utilitários de compactação pyc

para que você possa ver, QUASE o mesmo, o efeito de descompilação é MUITO BOM .

crifan
fonte
3

Sim, é possível.

Existe um perfeito descompilador Python de código aberto (.PYC), chamado Decompyle ++ https://github.com/zrax/pycdc/

O Decompyle ++ visa converter o código de bytes Python compilado de volta em código-fonte Python válido e legível por humanos. Embora outros projetos tenham conseguido isso com sucesso variado, o Decompyle ++ é único, pois procura oferecer suporte a código de bytes de qualquer versão do Python.

Andrew Rukin
fonte
2
Embora o pycdc seja bom, não é perfeito. Se você olhar em github.com/zrax/pycdc/issues, existem mais de 50 tipos individuais de problemas na descompilação. No entanto, isso está espalhado pelas 16 ou mais versões do python, e a linguagem e o código mudaram drasticamente. Pode ser que, nas coisas que você tentou, não tenha conseguido encontrar um problema. No entanto, na minha opinião, para classificar algo como "perfeito", seria necessário, digamos, toda a biblioteca Python para cada versão, descompilar e passar nos próprios testes corretamente. Nenhum decompilador pode fazer isso ainda.
rochoso
1

Instalar usando o pip install pycompyle6

pycompyle6 filename.pyc

Banik Kuntal
fonte