Можно ли декомпилировать скомпилированный файл .pyc в файл .py?

Ответы:

169

Uncompyle6 работает для Python 3.x и 2.7 - рекомендуемый вариант, так как это самый последний инструмент, нацеленный на объединение более ранних форков и сосредоточенный на автоматическом модульном тестировании. Страница GitHub содержит более подробную информацию.

  • если вы используете Python 3.7+, вы также можете попробовать decompile3 , форк Uncompyle6, ориентированный на 3.7 и выше.
  • при необходимости поднимайте проблемы GitHub в этих проектах - оба запускают наборы юнит-тестов для ряда версий Python

Старый Uncompyle2 поддерживает только Python 2.7. Некоторое время назад это помогло мне декомпилировать байт-код .pyc в .py, тогда как unpyclib вылетал за исключением.

Со всеми этими инструментами вы получите свой код обратно, включая имена переменных, но без комментариев.

RichVel
источник
7
Большое спасибо. Я случайно удалил мой .py файл вместо .pyc. Это избавило меня от необходимости переписывать его с нуля.
Авмохан
21
Для тех из вас, кто случайно удалил не тот файл, я настоятельно рекомендую контроль версий!
Эндрю Палмер
30

Да, вы можете получить это с unpyclibпомощью Pypi .

$ pip install unpyclib

Чем вы можете декомпилировать ваш .pyc файл

$ python -m unpyclib.application -Dq path/to/file.pyc
Pokutnik
источник
20
Я попробовал это, и он вылетел за исключением, на довольно маленьком файле без сложного кода (Django settings.py) - вместо этого отлично работал uncompyle2. -1 по этой причине.
RichVel
9
Сбой в Python 3.6 в lib \ site-packages \ unpyclib \ applcation.py с print __copyright- почему он использует версию Python 2.7 printбез скобок?
Дэвид Чинг
1
unpyclibПервый и последний выпуск @DavidChing был в 2009 году , можно сказать, что это программа только на Python 2.
Борис
28

Вы можете попробовать Easy Python Decompiler . Он основан на Decompyle ++ и Uncompyle2. Он поддерживает декомпиляцию Python версий 1.0-3.3

Примечание: я являюсь автором вышеуказанного инструмента.

Экстремальные Кодеры
источник
5
Это делает свою работу. Хорошая работа. Кстати, вы написали этот инструмент на Python?
Синдзоу
1
Работал хорошо для меня (легкое перетаскивание). Это правда, что Linux-дистрибутив был бы хорош, но не так уж сложно открыть коробку с окнами.
Брайан Джексон
Последний релиз в 2015 году и похоже, что это закрытый источник?
Борис
4

Да .

Я использую uncompyle6 decompile (даже поддерживаю последний Python 3.8.0):

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

и сравнение исходного и декомпилированного Python выглядит следующим образом:

pyc uncompile утилиты

так что вы можете видеть, ПОЧТИ так же, эффект декомпиляции ОЧЕНЬ ХОРОШО .

crifan
источник
3

Да, это возможно.

Существует отличный декомпилятор с открытым исходным кодом Python (.PYC), который называется Decompyle ++ https://github.com/zrax/pycdc/

Decompyle ++ стремится преобразовать скомпилированный байт-код Python обратно в действительный и понятный человеку исходный код Python. В то время как другие проекты достигли этого с переменным успехом, Decompyle ++ уникален тем, что стремится поддерживать байт-код из любой версии Python.

Андрей Рукин
источник
2
Хотя pycdc хорош, он не идеален. Если вы посмотрите на github.com/zrax/pycdc/issues, в декомпиляции есть более 50 отдельных типов проблем. Это, однако, распространяется на примерно 16 выпусков Python, и язык, и код сильно изменились. Возможно, что из-за того, что вы попробовали, вам не удалось найти проблему. Однако, по моему мнению, чтобы классифицировать что-то как «совершенное», нужно было бы взять, скажем, всю библиотеку Python для каждой версии, декомпилировать ее и правильно пройти ее собственные тесты. Ни один декомпилятор пока не может этого сделать.
Рокки
1

Установите с помощью pip install pycompyle6

pycompyle6 filename.pyc

Баник Кунталь
источник