Есть такое приложение. Называется py2exe. Оно позволяет упаковать, сконвертировать программу на python в exe файл (ну, точнее, exe и еще кучку других). Зачем оно все надо? Ну, далеко не у всех пользователей windows установлен интерпретатор python с нужными библиотеками. А вот упакованная программа в идеале должна запуститься на любой windows-машине.
К сожалению, py2exe не поддерживает третью версию питона.
Скачать py2exe можно на SourceForge.
Если у вас стоит python (а он у вас наверняка стоит), проблем с установкой возникнуть не должно. Ставится в директорию python.
Теперь начинается самое интересное. В директории, где лежит Ваша программа на python, надо создать файл setup.py со следующим содержанием
Далее запускаем упаковку командой:
Да-да, именно так.
Смотрим, что у нас получилось. Две папки.
build — служебная, можно сразу снести.
dist — собственно, в ней и лежит наша программа.
Как было сказанно выше, это не один файлик:
Неужели все так просто? Неправда;)
Скорее всего возникнут какие-то проблемы.
Например, пути к файлам. Не следует использовать относительные пути. Они ведут неведомо куда. Лучше использовать абсолютные.
Как его узнать? в интернете есть решение, функция module_path.
Или приложение наотрез откажется запускаться (возможно, не у Вас, а у кого-то еще). Из-за отсутствие библиотек Visual Studio.
В качестве решения проблемы можно установить их на компьютер (но это же не наш метод) или кинуть dll и файл манифеста в папку с программой.
msvcr90.dll и Microsoft.VC90.CRT.manifest(не знаю как это лицензируется и выкладывать не буду)
Где их взять? Для меня самым простым было переустановить python (все остальное осталось на месте) в режиме «только для меня». И искомые файлы оказались в папке с python.
Целью топика не являлось раскрыть всех особенностей py2exe. Здесь находится туториал, а тут некоторые советы и трюки.
В силу некоторых особенностей, приложение может получиться ужасающего размера. Но с этим можно и нужно бороться. Идеи подсказал kAIST (ну, кроме upx’а =р)
Ну вот, кажется, и все. Мы добились, чего хотели. Да, приложение получилось солидного размера (это вам не C++, например), зато на нашем любимом Python:)
Установка
К сожалению, py2exe не поддерживает третью версию питона.
Скачать py2exe можно на SourceForge.
Если у вас стоит python (а он у вас наверняка стоит), проблем с установкой возникнуть не должно. Ставится в директорию python.
Конвертация
Теперь начинается самое интересное. В директории, где лежит Ваша программа на python, надо создать файл setup.py со следующим содержанием
Copy Source | Copy HTML
- from distutils.core import setup
- import py2exe
-
- setup(
- windows=[{"script":"main.py"}],
- options={"py2exe": {"includes":["sip"]}}
- )
Где main.py имя Вашего скрипта.Далее запускаем упаковку командой:
setup.py py2exe
Да-да, именно так.
Смотрим, что у нас получилось. Две папки.
build — служебная, можно сразу снести.
dist — собственно, в ней и лежит наша программа.
Как было сказанно выше, это не один файлик:
- main.exe — программа
- pythonXX.dll — интерпретатор python'a
- library.zip — архив со скомпилированными исходниками (всего, кроме собственно программы, как я понимаю)
- .pyd — модули python, которые импортирует программа
- .dll — библиотеки, оказавшиеся необходимыми
- и еще файлы по мелочи, ниже будет сказано еще
Неужели все так просто? Неправда;)
Сложности
Скорее всего возникнут какие-то проблемы.
Например, пути к файлам. Не следует использовать относительные пути. Они ведут неведомо куда. Лучше использовать абсолютные.
Как его узнать? в интернете есть решение, функция module_path.
Copy Source | Copy HTML
- import os, sys
-
- def module_path():
- if hasattr(sys, "frozen"):
- return os.path.dirname(
- unicode(sys.executable, sys.getfilesystemencoding( ))
- )
- return os.path.dirname(unicode(__file__, sys.getfilesystemencoding( )))
Или приложение наотрез откажется запускаться (возможно, не у Вас, а у кого-то еще). Из-за отсутствие библиотек Visual Studio.
В качестве решения проблемы можно установить их на компьютер (но это же не наш метод) или кинуть dll и файл манифеста в папку с программой.
msvcr90.dll и Microsoft.VC90.CRT.manifest
Где их взять? Для меня самым простым было переустановить python (все остальное осталось на месте) в режиме «только для меня». И искомые файлы оказались в папке с python.
Целью топика не являлось раскрыть всех особенностей py2exe. Здесь находится туториал, а тут некоторые советы и трюки.
Размер
В силу некоторых особенностей, приложение может получиться ужасающего размера. Но с этим можно и нужно бороться. Идеи подсказал kAIST (ну, кроме upx’а =р)
- Самое действенное. Сжать библиотеки upx’ом. Консольное приложение. Работает элементарно. На вход передается файл, оно его сжимает. Для моей игры реверси размер уменьшился в ~3 раза.
- Удалить unicodedata.pyd, bz2.pyd, select.pyd, w9xpopen.exe. Веса немного, но, как минимум, в проекте станет меньше файлов
- Если в setup.py указать опцию optimize:2, то модули будут компилироваться в .pyo (python optimized code), а не в .pyc (python compiler script). Это не дает большого эффекта, но кто знает, может Вам повезет)
- И наконец, можно подчистить library.zip от неиспользованных модулей и кодировок. Только аккуратно.
Вывод
Ну вот, кажется, и все. Мы добились, чего хотели. Да, приложение получилось солидного размера (это вам не C++, например), зато на нашем любимом Python:)