23 апреля 2010 г.

В поисках утраченных исходников

Сегодня я работал над модульными тестами для своего Python-проекта. Для простоты файлы тестов называю так же, как и файлы тестируемых модулей. Я решил перенести тесты в другой каталог и мимодумно скопировал их в каталог модулей. Исходники модулей, конечно, затёрлись.
"А-а-а-а!!!" — подумал я. К счастью, остались оригинальные *.pyc-файлы — скомпилированный байт-код Python, который, по идее, можно превратить обратно в исходник.
Быстрый поиск выдал замечательный пост на не менее замечательном StackOverflow. Бесплатная утилита UnPyc помогла почти полностью восстановить один из файлов, но споткнулась на другом, с list comprehensions. Тогда я решил воспользоваться онлайн-сервисом DePython, но у него два ограничения:
  1. размер файла должен быть меньше 5 КБ;
  2. версия Python <= 2.5.
У меня была 2.6. В том же замечательном посте привели программку для конвертирования pyc-файла в версию 2.3 — вся идея в том, чтобы заменить первые 4 байта файла на соответствующие версии Python. Ещё немножко поиска помогло узнать magic-строку для версии 2.5.
К счастью, модулей было всего два :), осталась последняя закавыка — текст на русском раскодировался в виде \xx-последовательностей. Тогда я обернул текст исходников в такой код:
print """
<здесь перекодированный код>
"""
При запуске скрипта в консоли с локалью UTF-8 вывелись строчки с чистым русским текстом. Ура!

Мораль сего такова: будьте внимательны, чаще коммитьте и не отчаивайтесь.