Надійний спосіб забезпечити, щоб інші люди могли запускати мою програму python


17

Я хотів би розмістити програму python на GitHub і дозволити іншим завантажувати та запускати її на своїх комп’ютерах з різними операційними системами. Я відносно новачок у python, але достатньо використав його, щоб помітити, що використовувати різні версії всіх включених модулів для спільної роботи може бути проблематично. Я щойно виявив використання requirements.txt(генерується pipreqsта розгорнуто за допомогою команди pip install -r /path/to/requirements.txt), але дуже здивований, помітивши, що requirements.txtнасправді не зазначено, яка версія python використовується настільки очевидно, що вона не є повноцінним рішенням самостійно. Отже, моє запитання: який набір специфікацій / файлів / щось інше потрібен для того, щоб хтось, хто завантажував мій проект, насправді міг запустити його з найменшими можливими проблемами.

EDIT: Мій план повинен був керуватися тим, на яку відповідь було отримано найбільше відгуків. Але поки що, після 4 відповідей і 127 переглядів, жодна відповідь не має навіть одного голосування. Якщо частина відповідей не є доброю, було б корисно переглянути деякі коментарі щодо того, чому вони не є хорошими.


1
для найменших можливих проблем ви вважали Докер (або інші контейнерні рішення)? docker.com
Zaccharie Ramzi

Re: Docker ... Щойно знайшов це: "розробник може бути впевнений, що додаток буде працювати на будь-якій іншій машині Linux", - але я хочу, щоб це працювало на будь-якій ОС. ( opensource.com/resources/what-docker )
Мік

Зазвичай у вас є підтримка всіх класичних ОС: windows ( docs.docker.com/docker-for-windows ) та mac ( docs.docker.com/docker-for-windows )
Zaccharie Ramzi

2
Відповідь тут є дуже контекстуальною. Є чи програма Python робити речі , які є sysабо osчи функція типу подпроцесса або більш математичним / аналітичним? Перші можуть змінюватися з кожною версією Python, а пізніші можуть бути абсолютно незалежними. Які залежні бібліотеки? numpy і панди роблять дивовижну роботу на різних платформах, щоб ви могли просто перевірити, чи є у вас мінімальну версію. Яка основна версія Python? Різниця між Python 2.x та 3.x у залежних бібліотеках стає все складніше. Якщо ви пишете гарний код, орієнтований на загальний основний реліз, це чудовий початок.
dawg

2
Як свідчить безліч відповідей, існує так багато способів зробити це. Мені дуже цікаво, якби відповіді змінилися на основі знання того, що таке заявка. Я хотів би вважати, що це не має значення, але я підозрюю, що це могло. Я також думаю, що це дуже залежить від призначеної аудиторії. Кмітливий доктор фізичних наук, який працює в застосуванні для машинного навчання проти Джо в Інтернеті, граючи в пігаму шашок.
Марсель Вілсон

Відповіді:


15

Ви розглядали можливість створення setup.pyфайлу? Це зручний спосіб поєднання всіх ваших ... добре налаштувань в одне місце. Отже, все, що повинен робити ваш користувач: A) клонуйте репо і B) запустіть pip install .для запускуsetup.py

Існує велика дискусія щодо цього.

А також приклад ручки, написаний хлопцем із запитів.

Це має охоплювати більшість випадків використання. Тепер, якщо ви хочете зробити його по-справжньому розповсюджуваним, тоді ви захочете вивчити його налаштування в PyPi , офіційному центрі дистрибуції.

Крім того, якщо ви запитуєте, як зробити програму "ОС незалежною", не існує єдиного розміру для всіх. Це залежить від того, що ви робите зі своїм кодом. Потрібно вивчити, як ваш конкретний код взаємодіє з тими ОС тощо.


7

Є багато, багато, багато, багато, багато, багато, багато способів зробити це. Я буду ковзати над принципами, що стоять за кожним, і це є випадком використання.

1. Середовище пітона

Є багато способів зробити це. pipenv, конда requirments.txtтощо тощо.

За допомогою деяких із них ви можете вказати версії python. Що стосується інших, просто вкажіть діапазон версій python, з якими ви знаєте, з якими він працює - наприклад, якщо ви використовуєте python 3.7, навряд чи ви підтримуєте 3.6; є лише одна або дві незначні зміни. 3.8 також має працювати.

Ще один подібний метод setup.py. Зазвичай вони використовуються для розповсюдження бібліотек - як PyInstaller (інше рішення, про яке я згаду нижче), або numpy, або wxPython, або PyQt5 тощо - для імпорту / використання командного рядка. Посібник з упаковки python є досить корисним, і там є безліч навчальних посібників. (google python setup.py tutorial) Ви також можете вказати вимоги в цих файлах.

2. Контейнер

Докер - великий. Якщо ви цього не чули, я здивуюсь. Швидкий Google Узагальнюючий приходить з цим , що я процитую частину:

То чому ж усі люблять контейнери та Докер? Джеймс Боттомі, колишній CTO сервісу віртуалізації сервера і провідний розробник ядра Linux, пояснив, що гіпервізори VM, такі як Hyper-V, KVM і Xen, "базуються на емуляції віртуального обладнання. Це означає, що вони жирні з точки зору Системні вимоги."

Однак контейнери використовують спільні операційні системи. Це означає, що вони значно ефективніші, ніж гіпервізори в плані системних ресурсів. Замість віртуалізації обладнання, контейнери опираються на один екземпляр Linux. Це означає, що ви можете «залишити позаду непотрібні 99,9-відсотковий сміття, залишаючи перед собою невелику акуратну капсулу, що містить вашу заявку».

Це має підсумувати це для вас. (Зауважте, вам не потрібна конкретна ОС для контейнерів.)

3. Виконаний файл

Є два основні інструменти, які роблять це під час написання. PyInstaller і cx_Freeze. Обидва активно розвиваються. Обидва є відкритим кодом.

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

Особисто я віддаю перевагу PyInstaller - я один із розробників. PyInstaller надає всю свою функціональність за допомогою сценарію командного рядка та підтримує більшість бібліотек, про які ви можете придумати, - і їх можна розширити, щоб підтримувати більше. cx_Freeze вимагає сценарію настройки.

Обидва інструменти підтримують Windows, Linux, macOS тощо. PyInstaller може створювати окремі файли exes або один пакет папок, тоді як cx_Freeze підтримує лише один пакет папок. PyInstaller 3.6 підтримує python 2.7 та 3.5-3.7 - але 4.0 не підтримуватиме python 2. cx_Freeze знизив підтримку python 2 станом на останньому великому випуску (я думаю, 6,0).

У будь-якому випадку, достатньо про функції інструментів; ви можете самі заглянути в них. (Див. Https://pyinstaller.org та https://cx-freeze.readthedocs.io для отримання додаткової інформації)

Використовуючи цей метод розповсюдження, ви зазвичай надаєте вихідний код на репортажі GitHub, пару exes (по одній для кожної платформи), готових до завантаження, та інструкції, як створити код у виконуваний файл.


1

Найкращий інструмент, який я до цього часу використовував, - це Pipenv . Він не тільки уніфікує та спрощує весь робочий процес pip + virtualenv для вас, розробника, але також гарантує, що точні версії всіх залежностей (включаючи сам Python) будуть дотримані, коли інші люди керують вашим проектом з ним.

Веб-сайт проекту робить непогану роботу з пояснення, як користуватися інструментом, але, для повноти, я дам тут коротке пояснення.

Після того як ви встановите Pipenv (наприклад, запустивши pip install --user pipenv), ви можете перейти до каталогу свого проекту та запустити pipenv --python 3.7, так Pipenv створить новий virtualenv для вашого проекту, створить Pipfile та Pipfile.lock (докладніше про них пізніше) . Якщо ви продовжите і запустите, pipenv install -r requirements.txtто встановіть усі ваші пакунки. Тепер ви можете зробити, pipenv shellщоб активувати свій новий virtualenv, або pipenv run your_main_file.pyпросто запустити свій проект.

Тепер давайте розглянемо вміст вашого Pipfile. Це має бути щось подібне до цього:

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

У цьому файлі є людиночитані специфікації залежностей вашого проекту (зауважте, що він також вказує версію Python). Якщо у ваших вимогах.txt були закріплені версії, ваш Pipfile може також мати їх, але ви можете сміливо їх відміняти, оскільки точні версії зберігаються у Pipfile.lock. Тепер ви можете запускати такі речі, як pipenv updateоновлення залежностей, і не забудьте встановити Pipfile та Pipfile.lock у свій VCS.

Як тільки люди клонують ваш проект, все, що їм потрібно зробити, це запустити, pipenv installі Pipenv подбає про інше (він може навіть встановити правильну версію Python для них).

Сподіваюся, це було корисно. Я жодним чином не пов'язаний з Pipenv, просто хотів поділитися цим дивовижним інструментом.


1

Якщо у вашій програмі менше інтерфейсу GUI або у вас є веб-інтерфейс, ви можете поділитися кодом за допомогою Google Colaboratory.

https://colab.research.google.com/

Кожен може запустити його з однаковим середовищем. Не потрібно встановлювати.


1

Якщо перетворення всіх ваших скриптів python в один виконуваний файл може допомогти вам, то моя відповідь нижче допоможе ...

Я розробляю велику програму для настільних комп'ютерів виключно в python з 3 років. Це інструмент на основі GUI, побудований поверх бібліотеки pyqt (python-прив'язки рамки QT C ++).

В даний час я використовую бібліотеку упаковки " py2exe ": це розширення distutils, яке дозволяє створювати окремі виконувані програми Windows (32-розрядні та 64-бітні) із скриптів Python; все, що вам потрібно зробити, це:

  1. встановити py2exe: 'pip встановити py2exe'

  2. Створіть сценарій setup.py: використовується для визначення вмісту остаточного EXE (ім'я, значок, автор, файли даних, спільні бібліотеки тощо)

  3. Виконати: python setup.py py2exe

Я також використовую програмне забезпечення "Inno Setup" для створення інсталятора: створення ярликів, встановлення змінних середовища, піктограм тощо ...


py2exe не оновлювався роками. Я не можу знайти жодної недавньої активності. Я би припустив, що це не збережено. (Крім того, він підтримує лише python <3.4. Це означає, що він підтримує лише застарілі версії python).
Legorooj

0

Я думаю, ви можете використовувати Docker зі своїм пітоном https://github.com/celery/celery/tree/master/docker

люб’язно слідкуйте за файлами, і я думаю, ви зможете знайти спосіб зробити ваш файл докера для ваших сценаріїв python!


-1

Оскільки його немає в інших відповідях, я хотів би додати один зовсім інший аспект:

Блок тестування. Або тестування взагалі.

Зазвичай добре мати одну відому гарну конфігурацію. Залежно від залежностей програми, можливо, доведеться протестувати різні комбінації пакетів. Це можна зробити автоматизовано, наприклад, toxабо як частина CI / CD конвеєра.

Не існує загального правила, яку комбінацію пакунків слід протестувати, але зазвичай сумісність python2 / 3 є головною проблемою. Якщо у вас сильні залежності від пакетів з великими різницями версій, ви можете розглянути тестування на ці різні версії.


Це дуже важливий аспект розробки програмного забезпечення. Однак це повністю не відповідає на питання . Як одиничне тестування допомагає розповсюдженню програми?
Legorooj

ІМХО, ОП конкретно не просять про розподіл. Він запитує, якими способами переконатися, що інші люди можуть запускати його програму. Я думаю, що тестування одиниць може насправді зробити це, оскільки люди можуть бути обмежені у наборі пакунків, які можна використовувати. Взагалі питання про розповсюдження є важливим (і на нього тут відповіли), але я думаю, що в реальному сценарії ми не можемо розраховувати на створення цілого вентилятора лише для одного єдиного пакету - він повинен бути сумісний принаймні з деякими стандартними конфігураціями.
Dschoni

Я не заперечую, що тестування одиниць є цінним, щоб переконатися, що воно працює належним чином, але ОП запитав, як ділитися кодом "легко встановити". Ось чому я вважаю, що це неправдива відповідь - на це конкретне питання.
Legorooj

Я все ще думаю, що питання стосується не лише розподілу. Тому я додав цю відповідь. Якщо ви розробляєте, наприклад, Windows, тестування Unix є важливим, якщо ви хочете переконатися, що він працює перед розповсюдженням.
Dschoni

З цікавості, чим відрізняється від того, що я щойно сказав? ... making sure it runs correctly ...? Тестування є важливою частиною переконання, що воно працює правильно, тому це важлива частина підготовки до його розповсюдження, але все-таки це не має нічого спільного з фактичним його розповсюдженням
Legorooj

-1

Я надам вам короткий підсумок деяких існуючих доступних рішень, що стосується упаковки python, яку ви можете вибрати (знання - це сила):

  1. Дотримуйтесь вказівок Структурування вашого проекту , ці конвенції широко приймаються спільнотою python, і це, як правило, хороший вихідний момент, коли новачки починають кодування в python. Виконуючи ці вказівки, пітоністи, які дивляться ваш проект / джерело в github чи інших подібних місцях, відразу дізнаються, як його встановити. Крім того, завантаження проекту в pypi, а також додавання CI, дотримуючись цих правил, буде безболісним.

  2. Після того, як ваш проект буде структурований належним чином згідно зі стандартними умовами, наступним кроком може бути використання деяких доступних морозильників , на випадок, якщо ви хочете відправити кінцевим користувачам пакет, який вони можуть встановити, не змушуючи їх встановити пітон на своїх машини. Будьте в курсі, хоча ці інструменти не забезпечать вам захист коду ... сказано інакше, вилучення оригінального коду пітона з кінцевих артефактів було б тривіальним у всіх випадках

  3. Якщо ви все ще хочете відправити проект своїм користувачам, не змушуючи їх встановлювати будь-яку залежність від розробників, і ви також дбаєте про захист коду, щоб ви не хотіли розглядати жоден із існуючих морозильних камер, ви можете використовувати такі інструменти, як nuitka , shedskin , цитон або подібні. Зазвичай зворотний код від артефактів, створених цими інструментами, зовсім не банальний ... Захист від розтріскування з іншого боку - інша справа, і якщо ви не надаєте фізичному бінарному файлу для свого кінцевого користувача, ви не можете зробити багато про це, крім уповільнення їх :)

  4. Крім того, у випадку, якщо вам потрібно буде використовувати зовнішні мови у вашому проекті python, ще одним класичним посиланням, яке вам спадає на думку, було б https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages , додавши системи побудови таких інструментів до CI, дотримуючись правила 1 були б досить легкими.

З цього приводу я б запропонував дотримуватися пункту 1, оскільки я знаю, що це буде більш ніж добре, щоб розпочати роботу, а також саме цей пункт повинен охоплювати багато існуючих випадків використання для «стандартних» проектів python.

Хоча це не призначене для того, щоб бути повним посібником, дотримуючись тих, ви зможете опублікувати свій проект пітону в найкоротші терміни.

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