Python
После того, как ваша программа готова к релизу, вы вероятно хотите упаковать ее должным образом, прежде чем распространять. Если он состоит всего из одного файла .py, то это не такая уж и проблема, но если вы имеете дело с не программистами, даже помещая простую библиотеку Python в нужном месте, или изменение PYTHONPATH может быть больше того, что они ожидали. Пользователи обычно хотят просто двумя щелчками установить программу, используя установщик, и затем пользоваться программой.
В последнее время, Python программисты также привыкли к подобным удобствам, хотя и с немного более низкого уровня интерфейса. Инструментарий Distutils для распространения пакетов позволяет легко писать сценарии установки в Python. Вы можете использовать эти скрипты для создания файлов архива для релиза, который программист(пользователь) затем может использовать для компиляции или инсталяции ваших бинарников.
В этой главе я остановлюсь на Distutils, поскольку это важный инструмент в инструментарии программиста. Distutils выходит за рамки установки только скриптовых библиотек питона: вы можете создавать простые Windows установщики, и с расширением py2exe вы можете создать автономные исполняемые программы для Windows.
И если вы хотите самоустанавливающийся архив для ваших исполняемых файлов, я приведу несколько примеров для этого.
Distutils Основы
Distutils тщательно документирована в двух документах, «Distributing Python Modules» и «Installing Python Modules», оба доступны из Python Library Reference (http://python.org/doc/lib/module-distutils.html). Вы можете использовать Distutils делать всякие полезные вещи, написав сценарий так просто, как этот:
from distutils.core import setup
setup(name=’Hello’,
version=’1.0′,
description=’A simple example’,
author=’Magnus Lie Hetland’,
py_modules=[‘hello’])
Заметка. Дополнительные значения, заданные здесь, используются для нескольких вещей. Ключевые слова name и version, используются для именования архивных файлов, а также автора и описание, в конечном итоге в файле под названием PKG-INFO в любых архивах, которые вы создаете.
Вы действительно не должны писать всю эту информацию в функции setup (вы на самом деле не обязаны писать вообще что-либо), и вы конечно, можете указать больше (например, author_email или URL ). Имена должны быть понятны. В следующих разделах, вы увидите, как вы можете использовать этот простой сценарий.
Базовая установка
Назовите ваш скрипт setup.py (это универсальное соглашение для сценариев установки Distutils), и убедитесь, что у вас есть простой модуль под названием hello.py в том же каталоге.
Внимание. Сценарий установки будет создавать новые файлы и подкаталоги в текущем каталоге, когда вы запустите его, так что вы должны, вероятно, экспериментировать с ним в свежем каталоге, чтобы избежать перезаписи старых файлов.
Теперь запустите скрипт, вот так:
Вы должны получить примерно такой ответ:
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] . ]
or: setup.py —help [cmd1 cmd2 . ]
or: setup.py —help-commands
or: setup.py cmd —help
error: no commands supplied
Как вы можете видеть, вы можете получить более подробную информацию, используя —help или —help-команда. Попробуйте использовать команду сборки, просто чтобы увидеть Distutils в действии:
python setup.py build
Теперь вы должны видеть вывод, примерно как тут:
running build
running build_py
creating build
creating build/lib
copying hello.py -> build/lib
Distutils создал папку с именем build, с другой подпапкой с именем lib, и положил копию hello.py в build/lib. Подкаталог build своего рода рабочая область, где Distutils собирает пакет(и компилирует библиотеки расширения). Вам не нужно запускать команду build, когда вы устанавливаете—оно запустится автоматом, когда вы пишите команду install.
Говоря о котором. давайте попробуем установить модуль:
python setup.py instal
Внимание. Это скопирует модуль hello.py в какую-нибудь папку в PYTHONPATH . Это не представляет опасность, но если вы не хотите засорять вашу систему, вы можете удалить его позже; сделайте отметку о том, где он находится в качестве вывода setup.py. На момент написания статьи нет стандартной команды для удаления модуля, поэтому придется сделать это вручную.
Теперь вы должны видеть вывод, примерно как тут:
running install
running build
running build_py
running install_lib
copying build/lib/hello.py -> /path/to/python/lib/python2.4/site-packages
byte-compiling /path/to/python/lib/python2.4/site-packages/hello.py to hello.pyc
Примечание. Если вы используете Python, который вы не ставили для себя и у вас нет нужных прав, то вы не сможете установить модуль как здесь показано, потому что у вас нет прав на запись в этой директории.
Это стандартный механизм, используемый для установки модулей Python, пакетов и расширений. Все, что вам нужно сделать, это обеспечить небольшой скрипт установки.
В примере, я использовал только директиву py_modules от Distutils; если вы хотите установить пакет, вы можете использовать пакеты директивы аналогичным способом(просто перечислив имена пакетов).Есть много других вариантов, которые вы можете установить (некоторые из которых рассматриваются в разделе «Компиляция расширений» далее в этой главе). Вы также можете создать файлы конфигурации для Distutils, чтобы установить различные свойства (см. раздел «Distutils Configuration Files» в “Установка Python Модулей,” http://python.org/doc/inst/config-syntax.html)
Различные опции (ключи командной строки, аргументы ключевых слов для установки, а также конфигурационные файлы Distutils) позволяют сказать, что установить и куда. Приятно то, что эти параметры могут быть использованы для более чем одной вещи. В следующем разделе показано, как обернуть модули, указанные для установки в качестве архивного файла, готовые для распространения.
Обертываем вещички
Написав скрипт setup.py, который позволит установить пользователю ваши модули, вы так же можете использовать его для себя создав файл архива. Вы можете сделать его с помощью команды sdist (“source distribution”):
python setup.py sdist
Если вы запустите это, вы увидите разный текст, включая предупреждения. Предупреждения, которые я получаю включают жалобы об отсутствии опции author_email, MANIFEST.in и README. Мы безопасно можем игнорировать их все (хотя, не стесняйтесь добавить опцию author_email к вашему скрипту setup.py, также опцию author и README или README.txt и пустой файл, называемый MANIFEST.in в текущей директории).
ЧТО ТАКОЕ MANIFEST.in?
При создании дистрибутива исходного кода создается файл с именем MANIFEST , содержащий список всех ваших файлов. Файл MANIFEST.in является шаблоном для манифеста, и используется, когда используется для установки. Вы можете использовать следующие строки
чтобы указать файлы, которые вы хотите включить, если Distutils не понял это сам по себе, используя свой setup.py скрипт (и по умолчанию включает в себя, например, README ).
После предупреждений вы должны увидеть примерно следующее:
writing manifest file ‘MANIFEST’
creating Hello-1.0
making hard links in Hello-1.0.
hard linking hello.py -> Hello-1.0
hard linking setup.py -> Hello-1.0
tar -cf dist/Hello-1.0.tar Hello-1.0
gzip -f9 dist/Hello-1.0.tar
removing ‘Hello-1.0’ (and everything under it)
Заметка. Если вы запускали команду раньше, и у вас есть файл с именем MANIFEST, вы увидите слово reading, вместо writing в самом начале. Если вы изменили структуру своего пакета и хотите упаковать его, удалив файл манифеста может быть хорошей идеей, чтобы начать все заново.
Теперь, в дополнение к подкаталогу build у вас должен быть один под названием dist . Внутри него вы найдете архив gzip или zip, названый Hello-1.0.tar.gz . Теперь он может быть распространен среди других и они могут распаковать его и установить с помощью setup.py . Если вы не хотите формат .tar.gz , вы можете настроить другой формат через опцию —formats . (Так как множественное число указывает на более одного формата, через запятую вы можете указать форматы, чтобы создать больше архивов за раз). Доступные форматы в Python 2.4 являются bztar (для bzip2 архивов), gztar(для форматов gzip ), tar (для незжатых tar файлов), zip (для zip файлов), и ztar (для сжатых tar файлов, используются команды UNIX — compress ).
Существует также команда bdist , которую вы можете использовать (помимо всего прочего), чтобы создавать простые установщики Windows и файлы RPM для Linux. Обычно используется для создания бинарных дистрибутивов, где расширения были скомпилированы для конкретной архитектуры. Смотрите следующий раздел для получения информации о компиляции расширений.) Форматы доступные для bdist (в дополнение к sdist ) это rpm (для rpm пакетов) и wininst (для исполняемых файлов Windows).
Один интересный твист в том, что вы можете собрать Windows установщик для вашего пакета вне системы Windows, при условии, что у вам не нужно компилировать другие расширения. Если у вас есть доступ к обеим, ну скажем Linux и Windows, вы можете попробовать набрать следующее
python setup.py bdist —formats=wininst
на вашей Linux машине, и затем(после игнорирования парочки предупреждений от настроек компилятора) скопировать файл dist/Hello-1.0.win32.exe в вашу Windows машину и запустить. Затем вы увидите рудиментарный мастер установки. (Вы можете отменить процесс установки модуля, если хотите.)
ИСПОЛЬЗОВАНИЕ НАСТОЯЩЕГО УСТАНОВЩИКА
Установщик, который вы получили с помощью wininst из Distutils очень примитивен. В случае если вы использовали Distutils, то вы не сможете удалить ваши пакеты. Это не может быть проблемой для вас, но иногда вы можете захотеть более профессиональный вид. Это может быть особенно актуально, если вы создаете исполняемый файл, используя py2exe (описанный далее в этой главе). В этом случае, вы можете рассмотреть некоторые стандартные установщики, таких как Inno Setup(http://jrsoftware.org/isinfo.php), которые отлично работают с исполняемыми файлами созданными с помощью py2exe, и устанавливают вашу программу как обычную программу Windows и дают вам возможность как деинсталяция.
Установщик McMillan более ориентирован на Python (поиск в сети даст вам ссылку на страницу загрузки), который может работать как альтернатива py2exe при создании исполняемых файлов. Другие варианты включают InstallShield (http://installshield.com), Wise installer (http://wise.com), Installer VISE (http://www.mindvision.com), Nullsoft Scriptable Install System (http://nsis.sf.net), Youseful Windows Installer (http://youseful.com) и Ghost Installer (http://ethalone.com).
Для более подробной информации об установщиках Windows, смотрите книгу The Definitive Guide to Windows Installer(Phil Wilson) (Apress, 2004).
Компиляция расширений
В главе 17 вы видели как писать расширения для Python. Вы наверно согласитесь, что сборка этих расширений может быть немного обременительна время от времени; к счастью для этого вы можете использовать Distutils. Вы можете посмотреть исходный код программы palindrome в гл. 17(в листинг 17-6). Предположим, что у вас есть исходный файл palindrome2.c в текущей (пустой) папке, используя скрипт setup.py может быть использован для компиляции (и установки).
from distutils.core import setup, Extension
setup(name=’palindrome’,
version=’1.0′,
ext_modules = [
Extension(‘palindrome’, [‘palindrome2.c’])
])
Если вы запустите команду install со скриптом setup.py , расширение palindrome должно автоматически скомпилироваться до его установки. Как вы можете видеть, вместо того, чтобы указать список модулей, вы даете ext_modules аргумента список экземпляров Extension. Конструктор использует имя и список похожих файлов—это место, где вы должны указать хидер файлы(.h).
Если вы предпочли просто скомпилировать расширение (записывая результат в файл palindrome.so в текущем каталоге), вы можете использовать следующую команду:
python setup.py build_ext —inplace
Теперь вы действительно получили сочненькое. Если у вас установлен SWIG (см. главу 17) вы можете использовать Distutils напрямую!
Взгляните на исходный код оригинального palindrome.c (без всего оберточного кода) в листинге 17-3. Это, конечно, намного проще, чем обновленная версия. Возможность компиляции напряму в качестве Python расширения, имея Distutils и используя SWIG — может быть очень удобным. Это реально очень просто—вы просто добавляете имя файла интерфейса (.i) (см. листинг 17-5) в список файлов в экземпляре Extension.
from distutils.core import setup, Extension
setup(name=’palindrome’,
version=’1.0′,
ext_modules = [
Extension(‘palindrome’, [‘palindrome.c’,
‘palindrome.i’])
])
Если запустить этот скрипт, используя ту же команду, как и раньше (build_ext, возможно, с помощью переключателя —inplace), вы должны разобраться с файлом palindrome.so снова, но на этот раз без необходимости писать весь код обертки самостоятельно.
Создание исполняемых программ с py2exe
py2exe расширения для Distutils (доступное с http://starship.python.net/crew/theller/py2exe) позволяет вам создавать исполняемые файлы Windows(.exe), которые могут быть полезны, и чтобы ваши пользователи не устанавливали отдельно интерпретатор Python.
Совет. После создания исполняемой программы, вы наверно захотите использовать инсталлятор, например Inno Setup или недавно упомянутую главу — “Используем реальный установщик”, ранее в этой главе, чтобы распространять программу и сопутствующие файлы, созданные py2exe.
Пакет py2exe, может быть использован для создания исполняемых файлов с графическим интерфейсом (например wx, который описан в главе 12). Давайте посмотрим на небольшой пример (используя трюк raw_input, который был в главе 1, в секции “Что на счет двойного нажатия мыши?”):
print ‘Hello, world!’
raw_input(‘Press ‘)
Опять же, начинаем с пустой папки содержащий только один файл hello.py, затем создайте setup.py как тут:
from distutils.core import setup
import py2exe
setup(console=[‘hello.py’])
Вы можете запустить скрипт так:
python setup.py py2exe
Это создаст консольное приложение (так называемое Hello.exe) вместе с несколькими другими файлами в поддиректории Dist. Вы можете либо запустить его из командной строки или дважды щелкнуть по нему. Более подробную информацию о том, как py2exe работает и возможность использовать его в более сложных способах, можно найти на веб-сайте py2exe (http://starship.python.net/crew/theller/py2exe).
Быстрое Резюме
И наконец, теперь вы знаете как создать блестящие, профессионально выглядящие программы с графическим интерфейсом или как автоматизировать генерацию драгоценных файлов .tar.gz. Вот краткое изложение охваченных тем:
Distutils. Позволяет вам писать скрипты установщики, обычно называемые setup.py, которые позволяют устанавливать модули, пакеты и расширения и которые позволяют создавать простые инсталяторы и архивы для Windows.
Команды Distutils. Вы можете запустить ваш setup.py несколькими командами, такими как build, build_ext, install, sdist и bdist.
Установщики. Очень много разных генераторов инсталлеров и вы можете использовать большинство из них для установки ваших Python программ, делая процесс легким для ваших пользователей.
Компиляция расширений. Вы можете использовать Distutils, чтобы ваши C расширения компилировались автоматически, Distutils автоматически найдет установленный Python и выяснит какой использовать компилятор. Вы так же можете использовать SWIG автоматически.
py2exe. Расширение py2exe к Distutils может быть использован для создания исполняемых двоичных файлов из ваших программ Python. Наряду с парой дополнительных файлов (которые могут быть легко установлены с инсталлятором), эти EXE-файлы можно запустить без установки интерпретатора Python.
Что дальше?
Это все, для технического материала-разбирайтесь. В следующей главе вы получите методологию и философию, и затем пойдут проекты. Наслаждайтесь!
Как создать установщик программ на Windows?
Нужно создать установщик чтобы устанавливалась программа.
И чтобы были слайды с галочками установки партнёрского софта (На заднем фоне картинки).
Не подскажите как сделать или программу посоветуйте.
- Вопрос задан более трёх лет назад
- 469 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 3
Как вариант если есть в запасе время можешь освоить NSIS:
Запускается на всех версиях Windows, имеет разные способы сжатия. Используется свой собственный язык для создания инсталлятора. Большой плюс в NSIS можно использовать функции, подключать *.dll, и ты точно знаешь что ни чего лишнего твой инсталлятор не делает.
https://nsis.sourceforge.io/Download
https://nsis.ucoz.ru/index/0-4
Если времени мало можешь использовать Inno Setup (с помощью мастера создаешь базовые возможности, остальное пишешь сам)
Есть и другие инсталляторы, но подтвердить реализацию твоей задачи при помощи данных инсталляторов не могу:
— Windows Installer
— WiX (не путать с конструктором сайтов)
— IzPack
— InstallShield 11
Ответ написан более трёх лет назад
Нравится 2 1 комментарий

Владимир Коротенко @firedragon
NSIS хорош, но не слишком учитывает windows специфику.
WiX позволяет очень много, и большой его плюс в том что он полностью текстовой, плюс можно воткнуть библиотеки написанные на NET без необходимости ковыряться в COM
Python-сообщество
![]()
- Начало
- » Python для новичков
- » Создание инсталлятора под винду
#1 Ноя. 16, 2009 00:12:30
Enchantner От: Зарегистрирован: 2009-02-11 Сообщения: 442 Репутация: 0 Профиль Отправить e-mail
Создание инсталлятора под винду
Собственно, вопрос не совсем по питону, даже совсем не по питону, однако ж, думаю, многие с этим сталкивались. Нужно создать удобный инсталлятор под windows для программы на питоне, включив в него при этом интерпретатор питона, PyQt4 и еще пару модулей, все в .exe. Я все присматриваюсь к NSIS, но никак не соображу, как из-под него запустить инсталляторы для питона и модулей, да потом еще и прописать переменные окружения для чужой установки, даром что питон сам этого не делает. У кого есть опыт создания подобных инсталляторов? Какую систему лучше использовать и как?
Отредактировано (Ноя. 16, 2009 00:15:35)
#2 Ноя. 16, 2009 01:47:47
pasaranax От: Зарегистрирован: 2009-06-13 Сообщения: 574 Репутация: 0 Профиль Отправить e-mail
Создание инсталлятора под винду
А нельзя скомпилить прогу со всеми модулями в один ехе и одного его запихнуть в простейший инсталлер?
#3 Ноя. 16, 2009 10:01:07
Enchantner От: Зарегистрирован: 2009-02-11 Сообщения: 442 Репутация: 0 Профиль Отправить e-mail
Создание инсталлятора под винду
pasaranax
Сам хотел так сделать, но вот не получается. Зависимости все вроде удовлетворил, но программа при щелчке по экзешнику просто не запускается, не выдавая никаких ошибок. При этом если запустить py-файл — работает отлично.
Отредактировано (Ноя. 16, 2009 10:01:30)
#4 Ноя. 16, 2009 10:24:22
igor.kaist От: Зарегистрирован: 2007-11-12 Сообщения: 1879 Репутация: 3 Профиль Отправить e-mail
Создание инсталлятора под винду
Хм… Для начала собери нормально в py2exe, убедись в работоспособности, а потом делай инсталлер. На каком этапе проблема? Инсталлер грубо говоря, просто распихивает файлы по папочкам…
Отредактировано (Ноя. 16, 2009 10:26:47)
#5 Ноя. 16, 2009 10:47:54
Enchantner От: Зарегистрирован: 2009-02-11 Сообщения: 442 Репутация: 0 Профиль Отправить e-mail
Создание инсталлятора под винду
igor.kaist
Тут какая проблема — раньше все нормально собиралось и запускалось, но почему-то при переносе на чистую систему выдавало “Приложение некорректно настроено, переустановите его”. Сейчас же просто перестало запускаться, без всяких ошибок.
#6 Ноя. 17, 2009 12:01:57
alex312 От: Зарегистрирован: 2009-11-06 Сообщения: 6 Репутация: 0 Профиль Отправить e-mail
Создание инсталлятора под винду
Enchantner
igor.kaist
Тут какая проблема — раньше все нормально собиралось и запускалось, но почему-то при переносе на чистую систему выдавало “Приложение некорректно настроено, переустановите его”. Сейчас же просто перестало запускаться, без всяких ошибок.
посмотрите какие dll требуются для работы программы, возможно на чистую систему необходимо установить дополнительные билиотеки из состава VisualStudio, как вариант http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en
#7 Ноя. 17, 2009 21:29:42
Enchantner От: Зарегистрирован: 2009-02-11 Сообщения: 442 Репутация: 0 Профиль Отправить e-mail
Создание инсталлятора под винду
alex312
первым делом поставил, дело точно не в них
#8 Май 26, 2012 09:49:47
n2b От: Зарегистрирован: 2011-02-10 Сообщения: 125 Репутация: 0 Профиль Отправить e-mail
Создание инсталлятора под винду
Хочется собрать инсталлятор с несколькими библиотеками и питоном. py2exe не предлагать — не работает.
Подскажите как сделать пожалуйста.
#9 Май 26, 2012 10:38:20
sanodin От: Зарегистрирован: 2011-06-16 Сообщения: 515 Репутация: 31 Профиль Отправить e-mail
Создание инсталлятора под винду
Pyinstaller
На сайте http://pyinstaller.org хостится важнейшая для нас на сегодня тулза. Она представляет собой набор скриптов, которые позволяют из обычного py-скрипта сделать exe-шник. Скачивай ее с сайта или с диска и давай потестим. Допустим, ты распаковал ее на диск D:.
Конфигурируем:
D:\pyinstaller> Configure.py
Теперь для теста в папке D:\test\ создай питоновский скрипт test.py:
print "OK"
open("ok.txt", "w").write('ok')
Создание exe-шника проходит в два этапа. Сначала скриптом Makespec. py записывается файл «spec» с параметрами «компиляции», а затем — скрипт Build.py создает непосредственно экзешник. Скрипт Makespec.py, кроме пути к py-файлу принимает много разных параметров, но нам важны лишь эти:
• «F», на выходе получим один лишь exe-шник;
• «w», не показывать консоль, без этого параметра по умолчанию программа запускается с консольным окном;
• «X», использовать UPX для сжатия exe;
• «--icon=file.ico», использовать указанную иконку.
Во время разработки желательно использовать только один параметр («F») с целью создания отладочного режима, — чтобы в результате получился один файл и окно, в котором мы бы видели свои ошибки. Проверяем и компилируем:
D:\pyinstaller> Makespec.py -F -w -X d:\test\test.py
D:\pyinstaller> Build.py d:\pyinstaller\test\test.spec
Несколько секунд ожидания… готово! Результат работы покоится в папке d:\pyinstaller\test\dist\. Наш test.exe получился размером в 2.4 Мб, и, если его запустить, то может показаться, что ничего не сработало — окна нет. Однако ok.txt создается, а значит, все отлично работает.
Запускайте .exe через ком.строку ,что бы видеть какие ошибки выдает и по мере необходимости добавляйте модули
Если надо увидеть что пишет в окне шелла и закрывается то набираем program.exe /print c:\ doc\1.txt
Ну или просто запускаем прогу ехе из ком строки питона и тогда будет видно какие ошибки выдает окно шелла при запуске проги,каких может модулей не хватает
from cx_Freeze import setup, Executable
includes = ['zlib', 'zipfile', 'gzip','zipimport']
GUI2Exe_Target_1 = Executable(
script = "adcvasc.py",
base = 'Win32GUI',
compress = False,
copyDependentFiles = True,
appendScriptToExe = False,
appendScriptToLibrary = False,
icon = None
)
setup(
name = "hello",
version = "0.1",
executables = [GUI2Exe_Target_1],
options = "base": "Win32GUI",
"packages": "zipimport",
"copy_dependent_files": "True",
"includes": includes
>
>
)
Еще есть Nuitka,но с этим я так и не разобрался в свое время
Да и py2exe тоже можно собирать,главное правильно
Приступим к созданию exe файла. Создадим файл setup.py.
Содержание файла setup.py:
from distutils.core import setup
import py2exe
setup(console=['access.py'])
access.py – имя нашего скрипта авторизатора.
Чтобы создать ехе файл, выполним команду python setup.py py2exe.
В процесс создания ехе файла были созданы две директории: build и dist. Нам понадобится только dist.
Переходим в директорию dist. Выбираем файл access.exe и запускаем его.
при проблеме если при запуске ехе пишет типа нет модуля то добавляем модули так
from distutils.core import setup
import py2exe
setup(
windows=[],
options= 'py2exe':
'includes': ['lxml.etree', 'lxml._elementpath', 'gzip'],
>
>
)
в файл setup.py
Отредактировано sanodin (Май 26, 2012 11:00:04)
pynsist 2.8
Pynsist is a tool to build Windows installers for your Python applications. The installers bundle Python itself, so you can distribute your application to people who don’t have Python installed.
Pynsist 2.7 requires Python 3.6 or above. You can use Pynsist 2.6 on Python 3.5, and Pynsist 1.x on Python 2.7 and Python 3.3 or above, but these versions won’t get further updates.
Quickstart
- Get the tools. Install NSIS, and then install pynsist from PyPI by running pip install pynsist .
- Write a config file installer.cfg , like this:
This example illustrates how to use Pynsist by itself, for simple projects. There are other options which can make it easier to integrate as a step in a more complex build process. See the docs for more information.