Как я могу распространять программы на Python?

102

Мое приложение выглядит так:

main.py
окна /
    __init__.py
    mainwindow.py
    ...
модель/
    __init__.py
    orders.py
    ...
Ресурсы/
    image1.png
    logo.jpg
    ...

Программа запускается с main.py. Есть ли хороший способ создать на его основе «окончательное» приложение? Я думаю о чем-то вроде py2exe / py2app, но без копирования интерпретатора / модулей python в приложение, где есть только один исполняемый файл.

Я смотрел distutils, но похоже, что он устанавливает программу в каталог Python, что не является обычным для платформ, отличных от Linux.

На данный момент я просто копирую всю исходную папку на целевую машину и создаю псевдоним для main.pywWindows. Некоторые неудобства:

  • Значок является значком Python по умолчанию.
  • Мне нужно создать псевдоним вручную.
  • В моем исходном каталоге есть много дополнительных файлов, таких как папка управления версиями.
  • Я должен переименовать , main.pyчтобы main.pywвручную.
  • Было бы неплохо, если бы на целевой машине были только файлы `.pyo *. Для этого нет реальной причины, мне просто не нравится иметь ненужные файлы.

Как создать хорошее автоматизированное распространение?

  • для окон? (Это единственная платформа, которую я должен поддерживать на данный момент.)
  • для Mac?
  • для linux?
Георг Шёлли
источник
2
«Я посмотрел на distutils, но похоже, что он устанавливает программу в каталог Python, что необычно для платформ, отличных от Linux». Почему вы так говорите? В каком тексте вы прочитали это? Это конечно неправда, откуда у вас такое впечатление?
S.Lott

Ответы:

37

Обычный способ распространения приложений Python - с помощью distutils . Он предназначен как для распространения модулей Python библиотечного типа, так и для приложений Python, хотя я не знаю, как это работает в Windows. В любом случае вам придется в Windows установить Python отдельно, если вы используете distutils.

Я бы, вероятно, порекомендовал вам распространять его с помощью disutils для Linux и Py2exe или чего-то подобного для Windows. Для OS X не знаю. Если это приложение для конечного пользователя, вам, вероятно, понадобится нечто вроде образа диска, я не знаю, как это сделать. Но прочтите этот пост для получения дополнительной информации о пользовательском опыте. Для приложения, созданного для программистов, вам, вероятно, тоже подойдет установка типа distutils на OS X.

Леннарт Регебро
источник
1
Mac и Linux на данный момент не так важны. Py2app создает пакеты .app. И я думаю, что доставка приложений для Mac в формате .dmg устарела, следует использовать .zip. Можно ли использовать distutils, чтобы просто создать каталог distи скопировать в него все соответствующие файлы?
Георг Шёлли,
1
@gs: команда sdist создаст tar-файл всех исходных файлов.
Мартин против Лёвиса,
5
@gs: Отправка приложений Mac в формате .dmg на самом деле чрезвычайно распространена. .dmg - это образы дисков, а не формат для приложений (это будет .app). Таким образом, вы часто найдете один .app внутри .dmg вместе с некоторым файлом README.
Эрик О Лебигот,
3
@gs Я не знаю, почему вы хотите, чтобы distutils просто создавал каталог dist и копировал туда файлы, вы можете сделать это сами. Distutils делает множество вещей, включая создание установщиков Windows, а из Python 2.6 также создает ссылки в меню «Пуск». Тем не менее, вам потребуется установить Python отдельно, поэтому для приложения для конечного пользователя я думаю, что py2exe - лучшее решение, потому что оно включает собственный Python. Доставка / установщики для OS X подробно обсуждается Александром Лими в его блоге, поэтому я полагаюсь на него.
Леннарт Регебро,
61

Я настоятельно рекомендую Pyinstaller , который без проблем поддерживает все основные платформы. Подобно py2exe и py2app, он создает стандартный исполняемый файл в Windows и пакет приложений в OS X, но имеет то преимущество, что также выполняет фантастическую работу по автоматическому разрешению общих зависимостей и их включению без дополнительных настроек конфигурации.

Также обратите внимание, что если вы развертываете Python 2.6 в Windows, вы должны применить этот патч к магистрали Pyinstaller.

Вы указали, что вам не нужен установщик, но Inno Setup - это простой в использовании и быстрый в настройке вариант для платформы Windows.

Даниэль Нааб
источник
3
Не уверен, что это перебор. Объединение приложения с Pyinstaller на самом деле может быть проще, чем другие методы, особенно те, которые зависят от расширений c ... в большинстве случаев так же просто, как вызов командной строки в одну строку. Установка Python + зависимостей + самого приложения (будь то через distutils и т. Д. Или просто zip-файл) более сложна, особенно если разработчик не может вручную настроить целевую машину и должен предоставить инструкции клиенту. По крайней мере, в Windows я думаю, что такой стиль распределения имеет смысл.
Дэниел Нааб,
1
Немного неудобно с pyinstaller, когда вы используете исполняемый файл, созданный с помощью pyinstaller, начало выполнения занимает несколько секунд.
JuanPablo
1
Именно то, что я искал. Иногда мне нужно запускать скрипты на компьютерах, где я ничего не могу установить. Мне нужен единственный исполняемый файл без внешних зависимостей. Я могу выделить несколько секунд на запуск. Спасибо!
CodeMonkey 02
Не рекомендуется для небольших приложений, так как простая Hello worldпрограмма займет 500 МБ места и время инициализации 3-5 секунд.
Raf
Вы можете избежать этого количества места, используя отдельную среду для распространения вашего приложения (например, используя venv или pyenv)
Александр Сантос
4

Fredrik Lundh's squeeze.pyможет создать один файл, который не содержит интерпретатора Python, но вместо этого содержит байт-код. С правильными аргументами вы можете включать в файл результатов другие файлы, модули и т. Д. Я успешно использовал его в одном проекте. Полученная программа без проблем работала в OS X, Linux и Windows!

PS : На каждой машине должен быть интерпретатор Python, совместимый с байт-кодом, сгенерированным squeeze.py. При необходимости вы можете сгенерировать разные версии байт-кода для разных версий Python (просто запустите squeeze.py с нужной версией Python).

Эрик О Лебигот
источник
4

Я думаю, что также стоит упомянуть PEX (учитывая большее внимание, которое получил этот вопрос, а не сам вопрос). По собственному описанию :

Файлы PEX представляют собой автономные исполняемые виртуальные среды Python. В частности, они представляют собой тщательно сконструированные zip-файлы со #!/usr/bin/env pythonспециальными элементами, __main__.pyкоторые позволяют взаимодействовать со средой выполнения PEX. Для получения дополнительной информации о zip-приложениях см. PEP 441 .

Я наткнулся на это, когда читал обзор упаковки для python . Там выложили красивую картинку: введите описание изображения здесь

Подводя итог: если вы можете позволить себе полагаться на установку python на целевой машине, используйте PEX для создания самодостаточного «исполняемого файла», который, вероятно, будет иметь меньший размер файла, чем, например, исполняемый файл, созданный PyInstaller.

пользователь3389669
источник
2

Я могу ошибаться, но разве IronPython не имеет встроенного компилятора для Windows?

http://www.ironpython.net

[РЕДАКТИРОВАТЬ]

Попробуйте Cx_Freeze, лучший компилятор .py в .exe (плюс несколько .dll), который я когда-либо использовал.

http://cx-freeze.sourceforge.net/

Сами Бенчериф
источник
1

Если вы распространяете в Windows, используйте установщик, чтобы установить все необходимые файлы / интерпретатор. Распространите файл setup.exe. Это лучший способ для окон. В противном случае пользователи будут жаловаться.

Байрон Уитлок
источник
1
Мне не нужен установщик, потому что есть только один пользователь, который собирается использовать программу. Но, конечно, при написании программы для большего числа пользователей это необходимо в Windows.
Георг Шелли,
1
@gs: О, только один пользователь. Хорошо, тогда я бы порекомендовал создать базовый пакет distutils, либо исходный дистрибутив, либо двоичный установщик Windows. Это определенно простой и приятный способ распространения модуля Python.
Леннарт Регебро,
0

Самый удобный * кроссплатформенный способ распространения настольных приложений python - полагаться на кроссплатформенный менеджер пакетов conda. Его используют несколько инструментов:

  • Miniconda-Install - сценарии powershell / bash, которые автоматически загружают Miniconda и создают изолированную среду conda для приложения. Поддерживает pip, но, похоже, не обслуживается и имеет проблемы с загрузкой https.
  • Проект Anaconda и конструктор (conda) от Continuum. Оба используют conda. (conda) конструктор, похоже, может создавать автономные установщики и даже установщик NSIS в Windows, но не поддерживает pip. Похоже, что они ведут себя как установщики Anaconda / Miniconda.
  • PyAppShare - конечный пользователь сначала устанавливает Miniconda / Anaconda (как среда выполнения). Затем сценарий одиночной установки batch / bash создает изолированную среду conda из спецификации yaml. Приложение также представляет собой пакет conda / pip, который устанавливается в среду и создается исполняемая точка входа. Кросс-платформенный рабочий стол и ярлыки программ создаются автоматически. Они активируют среду и запускают приложение. Поддерживает пип.

* Самый удобный для разработчика. Достаточно удобно для конечного пользователя.

Петр Загубисало
источник