Як я можу поширювати програми python?


102

Моя програма виглядає так:

main.py
вікна /
    __init__.py
    mainwindow.py
    ...
модель /
    __init__.py
    order.py
    ...
ресурси /
    image1.png
    logo.jpg
    ...

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

Я дивився на distutils, але це виглядає так, що він встановлює програму в каталог Python, що не зазвичай на нелінукс-платформах.

На даний момент я просто копіюю всю папку джерела на цільову машину і створюю псевдонім для main.pywWindows. Деякі незручності:

  • Піктограма є пітоном за замовчуванням.
  • Я повинен створити псевдонім вручну.
  • У моєму вихідному каталозі є маса додаткових файлів, таких як папка управління джерелом.
  • Я повинен перейменувати , main.pyщоб main.pywвручну.
  • Було б добре, якби на цільовій машині знаходяться лише файли `.pyo *. Немає справжньої причини для цього, мені просто не подобається мати непотрібні файли.

Як можна створити приємний автоматизований розподіл?

  • для вікон? (Це єдина платформа, яку я маю підтримувати на даний момент.)
  • для mac?
  • для Linux?

2
"Я дивився на distutils, але це виглядає так, що він встановлює програму в каталог Python, що не є звичайним на нелінукс-платформах." Чому ви це говорите? Який текст ви читали, що говорив про це? Це, звичайно, неправда, звідки ви склали таке враження?
S.Lott


Відповіді:


37

Нормальний спосіб розповсюдження програм Python - це distutils . Він створений як для розповсюдження бібліотечних модулів python, так і для програм python, хоча я не знаю, як це працює в Windows. Якщо ви використовуєте distutils, у будь-якому випадку вам доведеться встановлювати Python окремо.

Я, напевно, рекомендую поширити його за допомогою дистилятів для Linux та Py2exe або чогось подібного для Windows. Для OS XI не знаю. Якщо це кінцевий додаток для користувача, ви, ймовірно, хочете отримати щось із зображення образу диска, я не знаю, як це зробити. Але прочитайте цю публікацію, щоб отримати докладнішу інформацію про досвід користувача. З додатком, зробленим для програмістів, ви, ймовірно, добре з типом встановлення 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.
Ерік О Лебігот

2
@gs Я не знаю, чому ви хочете, щоб distutils просто зробила каталогічну дію і скопіювала туди файли, ви можете зробити це самостійно. 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

Не рекомендується для невеликих програм, оскільки проста Hello worldпрограма займе 500 МБ місця та 3-5 секунд часу для ініціалізації.
Раф

Ви можете уникнути цього простору, використовуючи окреме середовище для розповсюдження програми (наприклад, використовуючи venv або pyenv)
Alexander Santos

4

Фредріка Лунда squeeze.py може створити єдиний файл, який не містить інтерпретатора Python, а натомість містить байт-код. За допомогою правильних аргументів у файл результатів можна включити інші файли, модулі тощо. Я успішно використовував його в одному проекті. Отримана програма без проблем працювала на OS X, Linux та Windows!

PS : Кожна машина повинна мати інтерпретатор Python, сумісний з байтовим кодом, згенерованим сціп.py. Ви можете генерувати різні версії байтових кодів для різних версій Python, якщо це необхідно (просто запустіть файл create.py з правою версією Python).


4

Я думаю, що також варто згадати PEX (зважаючи на більшу увагу, яку це питання отримало, і менше саме питання). Відповідно до власного опису :

Файли PEX - це автономні виконувані віртуальні середовища Python. Більш конкретно, вони ретельно сконструйовані поштові файли з #!/usr/bin/env pythonта спеціальним, __main__.pyщо дозволяє взаємодіяти з режимом виконання PEX. Для отримання додаткової інформації про поштові програми див. PEP 441 .

Я наткнувся на це, коли прочитав огляд упаковки для пітона . Вони розмістили цю приємну картинку там: введіть тут опис зображення

Підводячи підсумок: Якщо ви можете дозволити, покладаючись на встановлення python на цільовій машині, використовуйте PEX, щоб створити самодостатній "виконуваний файл", який, мабуть, буде мати менший розмір файлу, ніж виконуваний файл, наприклад, створений PyInstaller.



1

Якщо ви розповсюджуєте у Windows, використовуйте інсталятор, щоб встановити всі відповідні файли / інтерпетер, що потрібно. Розподіліть setup.exe. Це найкращий спосіб для вікон. Інакше користувачі будуть скаржитися.


1
Мені не потрібен інсталятор, оскільки є лише один користувач, який збирається використовувати програму. Але звичайно, коли пишуть програму для більшої кількості користувачів, яка є обов'язковою для Windows.
Георг Шоллі

1
@gs: О, лише один користувач. Добре, тоді я б рекомендував зробити базовий пакунок distutils, або розподіл джерела, або встановлення двійкового програмного забезпечення Windows. Це, безумовно, простий і приємний спосіб розподілити модуль Python.
Леннарт Регебро

0

Найзручніший * кросплатформенний спосіб розповсюдження настільних додатків python - це покластися на менеджер пакунків міжплатформних кондо. Існує кілька інструментів, які використовують його:

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

* Найзручніше для розробника. Досить зручно для кінцевого споживача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.