Pull to refresh

Немного про py2exe

Reading time 4 min
Views 125K
Есть такое приложение. Называется py2exe. Оно позволяет упаковать, сконвертировать программу на python в exe файл (ну, точнее, exe и еще кучку других). Зачем оно все надо? Ну, далеко не у всех пользователей windows установлен интерпретатор python с нужными библиотеками. А вот упакованная программа в идеале должна запуститься на любой windows-машине.


Установка


К сожалению, py2exe не поддерживает третью версию питона.
Скачать py2exe можно на SourceForge.
Если у вас стоит python (а он у вас наверняка стоит), проблем с установкой возникнуть не должно. Ставится в директорию python.

Конвертация


Теперь начинается самое интересное. В директории, где лежит Ваша программа на python, надо создать файл setup.py со следующим содержанием
Copy Source | Copy HTML
  1. from distutils.core import setup
  2. import py2exe
  3.  
  4. setup(
  5.     windows=[{"script":"main.py"}],
  6.     options={"py2exe": {"includes":["sip"]}}
  7. )
Где main.py имя Вашего скрипта.

Далее запускаем упаковку командой:
setup.py py2exe

Да-да, именно так.

Смотрим, что у нас получилось. Две папки.
build — служебная, можно сразу снести.
dist — собственно, в ней и лежит наша программа.

Как было сказанно выше, это не один файлик:
  • main.exe — программа
  • pythonXX.dll — интерпретатор python'a
  • library.zip — архив со скомпилированными исходниками (всего, кроме собственно программы, как я понимаю)
  • .pyd — модули python, которые импортирует программа
  • .dll — библиотеки, оказавшиеся необходимыми
  • и еще файлы по мелочи, ниже будет сказано еще

Неужели все так просто? Неправда;)

Сложности


Скорее всего возникнут какие-то проблемы.

Например, пути к файлам. Не следует использовать относительные пути. Они ведут неведомо куда. Лучше использовать абсолютные.
Как его узнать? в интернете есть решение, функция module_path.
Copy Source | Copy HTML
  1. import os, sys
  2.  
  3. def module_path():
  4.     if hasattr(sys, "frozen"):
  5.         return os.path.dirname(
  6.             unicode(sys.executable, sys.getfilesystemencoding( ))
  7.         )
  8.     return os.path.dirname(unicode(__file__, sys.getfilesystemencoding( )))

Или приложение наотрез откажется запускаться (возможно, не у Вас, а у кого-то еще). Из-за отсутствие библиотек Visual Studio.
В качестве решения проблемы можно установить их на компьютер (но это же не наш метод) или кинуть dll и файл манифеста в папку с программой.
msvcr90.dll и Microsoft.VC90.CRT.manifest (не знаю как это лицензируется и выкладывать не буду)
Где их взять? Для меня самым простым было переустановить python (все остальное осталось на месте) в режиме «только для меня». И искомые файлы оказались в папке с python.

Целью топика не являлось раскрыть всех особенностей py2exe. Здесь находится туториал, а тут некоторые советы и трюки.

Размер


В силу некоторых особенностей, приложение может получиться ужасающего размера. Но с этим можно и нужно бороться. Идеи подсказал kAIST (ну, кроме upx’а =р)

  1. Самое действенное. Сжать библиотеки upx’ом. Консольное приложение. Работает элементарно. На вход передается файл, оно его сжимает. Для моей игры реверси размер уменьшился в ~3 раза.
  2. Удалить unicodedata.pyd, bz2.pyd, select.pyd, w9xpopen.exe. Веса немного, но, как минимум, в проекте станет меньше файлов
  3. Если в setup.py указать опцию optimize:2, то модули будут компилироваться в .pyo (python optimized code), а не в .pyc (python compiler script). Это не дает большого эффекта, но кто знает, может Вам повезет)
  4. И наконец, можно подчистить library.zip от неиспользованных модулей и кодировок. Только аккуратно.

Вывод


Ну вот, кажется, и все. Мы добились, чего хотели. Да, приложение получилось солидного размера (это вам не C++, например), зато на нашем любимом Python:)
Tags:
Hubs:
+42
Comments 35
Comments Comments 35

Articles