Как стать автором
Обновить

Комментарии 35

НЛО прилетело и опубликовало эту надпись здесь
забыли упомянуть что эта славная приблуда работает только со второй версией python. ну может и с первой, но не суть важно. главное что не с третьей, вот)
optimize:2 не даст большого эффекта, но вырежет docstring`и; для некоторых приложений они необходимы. это не самое удачное решение, но я иногда хранил в них какие-то важные для программы данные.
> msvcr90.dll и Microsoft.VC90.CRT.manifest [...] Где их взять?

Можно проще: поискать в гугле. :) Существует достаточно много сайтов с коллекциями разных DLL-файлов.

Непонятно, почему py2exe использует библиотеку Visual Studio установленной версии, а не древнюю (шестой версии, вроде) msvcr.dll, которая есть везде?
Официальная сборка Python 2.6 — с msvcr90.dll. В принципе, можно собрать его и VC6, но я бы не стал рисковать — слишком неоттестировано.
Я не могу понять часть комментария про риск, т.к мало имел дело с компиляторами. Но разве не компилятор Visual Studio дёргает эту DLLку? Он. Следовательно, какая разница чем собран питон?

Поэтому как может быть неоттестировано?
py2exe ничего не компилирует, а создаёт стаб, который прописывает пути к питоновским модулям и вызывает настоящий интерпретатор из pythonXX.dll. Естественно, если питон собран VC9, то pythonXX.dll зависит от msvcrt90.dll
Я и не писал, что py2exe чего-то компилирует.

По поводу комментария ниже (про риски). Суть понятна: глюков может и не быть, но мало ли чё. :)
А насчет риска — слишком мало людей используют питон, собранный VC6, так что вполне вероятны какие-нибудь грабли из-за багов компилятора, другого поведения рантайма или ещё по какой причине.
Ни разу не встречались программы написанные на Python, упакованые в ехе и распространяемые таким образом. Сам, когда изучал Python, пробовал эту фишку, но так, ради любопытства, не более… Хотя да, если программа написана для себя и планируется её запуск на машине без интерпретатора то это, наверное, выход..., но для массового распространения вариант сомнительный…
Я такую писал. Неудобно, архив большой, приходилось рядом с exe доп. библиотеки по полметра класть. Но люди всё-равно качали и пользовались, варезники всё-равно распространяли. Размер архива был где-то 5-8 метров. Пять в начале и восемь — у последней выпущенной версии. Хотя программка сама по себе была малюсенькой.

Меня только единожды упрекнули и не в весе архива, а в языке: мол, зачем на питоне, если можно было на дельфи (кажется, его предлагали).
НЛО прилетело и опубликовало эту надпись здесь
Например, Google App Engine SDK для Windows собран с помощью py2exe.
наш софт писаный на питоне пакуется так. а еще и InnoSetup завернут. Очень удобно. Простые люди даже не догадываются, что это софт на питоне писан.
bittorrent тоже py2exe пакуется для инасталляторов под win32
А PyInstaller умеет все то же самое, но кроме того упаковывает манифесты и msvcr автоматически (с патчем на него), плюс поддерживает всякие иконки для exe файла, из коробки — UPX и не создает файлов для stdin/stdout, если отключен консольный режим (клиентов лишние файлы всегда смущают).

Жаль, что про него мало кто говорит, а по мне — так гораздо более достойный вариант.
Сейчас посмотрел, согласен, pyinstaller куда проще и все получилось с первого раза. Но размер exe получился 10,5 мб против 8,6 у py2exe (для приложения использующено py2exe). Однако, похоже я все же буду использовать PyInstaller…
Там есть тулза ArchiveViewer.py, делаете ей «ArchiveViewer.py ВашФайл.exe», и смотрите какой лишней хрени оно туда запихнуло.

Потом в файле проекта я обычно пишу:

a = Analysis(

...........

excludes = [
'win32ui',
'win32api',
'_ssl',
'bz2',
'Microsoft.VC90.CRT\\msvcm90.dll',
]
)


Без этих либ оно обычно всегда работает, размер получается около 6Мб.

Если с PyQt, то еще есть такой финт ушами, чтобы он туда не пропихнул кучу ненужных плагинов для всего подряд:

bad_files = []
for name,path,type in a.datas:
if name.startswith('qt4_plugins'):
bad_files.append((name,path,type))
a.datas -= bad_files


Сборка, включающая в себя PyQt (QtCore+QtGui) получается обычно 9-10.5 Мб.
Удалось сжать до 9,5 мб. Спасибо, добрый человек)
для приложения использующено py2exe
pyqt4, конечно же :-[
С PyQt да, меньше 10мб трудно сделать. Хотел для этого перекомпилить PyQt через VS (по дефолту скачивается MinGW версия), чтобы сделать его меньше по объему и выкинуть mingw-ные либы. Помню когда на Qt писал, то VS-ные сборки были прям чуть ли не в 2 раза легче по размеру.

Но пока лень… Да и какая, впрочем, разница, ну будет 8 метров вместо 10 — при нынешних объемах жестких дисков и ширине каналов это давно уже мало имеет значения для таких продуктов. А там, где значение имеет — нечего на питоне писать, там с++ есть и даже голый си…
Таааак. Не все так радужно оказалось. На другом компьютере (там, как минимум, не установлены библиотеки студии) приложение отказывается запускаться.
Error loading python DLL: path/python26.dll (error code 14001)

Собирал так:
Makespec.py -F -w -X main.py
Build.py ./main/main.spec

Не сталкивались?
Надо патч для поддержки питона 2.6 с его манифестами. Брать отсюда, там есть список, возьмите посвежей. Накатить надо поверх той ревизии для которой предназначен патч.

Один раз сделаете себе патченую версию, дальше можно пользоваться ей и горя не знать. У меня полугодовой давности вот пользуюсь постоянно — и ничего, проблем не испытываю.
Слил к себе 771 ревизию PyInstaller. Накатил последний патч (pyinstaller-trunk-r768-py26-win-tweaks-20100210.patch) для 768 ревизии. Пересобрал приложение. Ошибка та же =/
Очевидно что надо было слить 768 ревизию ;-)
Сжатие upx'ом нужно разве что для того, чтобы это дело занимало мало место на диске. Аналогичный эффект достигается при создании инсталлятора.
В памяти же, размер будет исходный.

Как вариант можно создать минимальную необходимую для нашей программы сборку питона.
PyInstaller автоматически отслеживает зависимости всех файлов (даже бинарных) и включает только их. Конечно, это делает сборку проекта не моментальной, зато результат хороший.
Для третьего питона конечно это не заработает?
Угу :( Надо дописать в топик.
«Ну, далеко не у пользователей „

Наверно правильно: “Ну, далеко не у всех пользователей „
Fixed.
А кто такой Веся Неманого? oO
Оу. Интересный вопрос.
А как указать путь для каталога build? C dist_dir все понятно, а вот мусорный build приходится сносить батником, хотел бы его куда-нибудь в %temp% засунуть.
Он не мусорный, он помогает когда много раз ребилдишь… Типа не баг, а фича;)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации