Надежный способ убедиться, что другие люди могут запускать мою программу на Python

17

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

РЕДАКТИРОВАТЬ: Мой план должен был руководствоваться тем, какой ответ получил наибольшее количество голосов. Но до сих пор, после 4 ответов и 127 просмотров, ни у одного ответа не было ни одного возражения. Если некоторые ответы не годятся, было бы полезно увидеть некоторые комментарии о том, почему они не годятся.

Мик
источник
1
Для наименьшего количества возможных проблем, вы рассматривали Docker (или другие решения на основе контейнеров)? docker.com
Зачари Рамзи
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 и Pandas отлично работают на разных платформах, так что вы можете просто проверить, что у вас есть минимальная версия. Какая основная версия Python? Разница между Python 2.x и 3.x с зависимыми библиотеками становится еще сложнее. Если вы пишете хороший код, ориентированный на общий основной выпуск, это хорошее начало.
Dawg
2
Как свидетельствует множество ответов, есть много способов сделать это. Я действительно интересно , если ответы будут меняться в зависимости от знания того, что приложение. Я хотел бы верить, что это не должно иметь значения, но я подозреваю, что это может. Я также думаю, что это очень сильно зависит от предполагаемой аудитории. Опытный доктор философии по физике, работающий с приложением для машинного обучения, и Джо, играющий в шашки.
Марсель Уилсон

Ответы:

15

Рассматривали ли вы создание setup.pyфайла? Это удобный способ объединения всех ваших ... хорошо настроенных в одном месте. Таким образом, все, что должен сделать ваш пользователь, это A) клонировать репозиторий и B) запустить pip install .для запускаsetup.py

Об этом идет отличная дискуссия.

А также пример дескриптора, написанный по просьбе парня.

Это должно охватывать большинство случаев использования. Теперь, если вы хотите сделать его действительно распространяемым, вам нужно будет настроить его в PyPi , официальном центре распространения.

Кроме того, если вы спрашиваете, как сделать программу «независимой от ОС», то не существует одного, подходящего всем. Это зависит от того, что вы делаете со своим кодом. Требуется изучить, как ваш конкретный код взаимодействует с этими ОС и т. Д.

Тейлор Кокран
источник
7

Есть много, много, много, много, много, много, много способов сделать это. Я расскажу о принципах, лежащих в основе каждого, и это вариант использования.

1. среда Python

Есть много способов сделать это. 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. Контейнер

Докер большой. Если вы не слышали об этом, я буду удивлен. Краткий гугл резюме дает это , часть которого я процитирую:

Так почему же все любят контейнеры и докеры? Джеймс Боттомли, бывший технический директор Parallels по виртуализации серверов и ведущий разработчик ядра Linux, объяснил, что гипервизоры виртуальных машин, такие как Hyper-V, KVM и Xen, «основаны на эмуляции виртуального оборудования. Системные Требования."

Контейнеры, однако, используют общие операционные системы. Это означает, что они намного более эффективны, чем гипервизоры в терминах системных ресурсов. Вместо виртуализации оборудования контейнеры располагаются поверх одного экземпляра Linux. Это означает, что вы можете «оставить бесполезный 99,9% мусора ВМ, оставив вам небольшую аккуратную капсулу, содержащую ваше приложение».

Это должно подвести итог для вас. (Обратите внимание, что вам не нужна конкретная ОС для контейнеров.)

3. Исполняемый файл

Есть 2 основных инструмента, которые делают это во время написания. PyInstaller и cx_Freeze. Оба активно развиваются. Оба с открытым исходным кодом.

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

Лично я предпочитаю PyInstaller - я один из разработчиков. PyInstaller предоставляет все свои функции через сценарий командной строки и поддерживает большинство библиотек, о которых вы только можете подумать, и расширяется, чтобы поддерживать больше. cx_Freeze требует сценария установки.

Оба инструмента поддерживают Windows, Linux, MacOS и многое другое. PyInstaller может создавать отдельные файлы exe или один пакет папок, тогда как 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, пару готовых к загрузке exe-файлов (по одному для каждой платформы) и инструкции о том, как встроить код в исполняемый файл.

Legorooj
источник
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). Если в вашем файле require.txt были закрепленные версии, они также могут быть в вашем Pipfile, но вы можете смело использовать их подстановочные знаки, потому что точные версии хранятся в Pipfile.lock. Теперь вы можете запускать такие вещи, как pipenv updateобновление ваших зависимостей, и не забудьте зафиксировать Pipfile и Pipfile.lock в вашей VCS.

Как только люди клонируют ваш проект, все, что им нужно сделать, это запустить, pipenv installа Pipenv позаботится обо всем остальном (он может даже установить для них правильную версию Python).

Я надеюсь, что это было полезно. Я никак не связан с Pipenv, просто хотел поделиться этим замечательным инструментом.

gflorio
источник
1

Если ваша программа меньше относится к графическому интерфейсу или имеет веб-интерфейс, вы можете поделиться кодом с помощью Google Colab Laboratory.

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

Каждый может запустить его в одной среде. Нет необходимости в установке.

korakot
источник
1

В случае, если преобразование всех ваших скриптов Python в один исполняемый файл может помочь вам, тогда мой ответ ниже поможет ...

Я занимаюсь разработкой большого настольного приложения исключительно на python с 3 лет. Это инструмент на основе графического интерфейса, построенный на основе библиотеки pyqt (привязки к Python инфраструктуры QT C ++).

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

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

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

  3. Выполнить: python setup.py py2exe

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

Рида Шамасне
источник
py2exe не обновлялся годами. Я не могу найти какие-либо недавние действия. Я бы предположил, что это не поддерживается. (Кроме того, он поддерживает только Python <3.4. Это означает, что он поддерживает только устаревшие версии Python).
Легорой
0

Я думаю, что вы можете использовать докер с вашим питоном https://github.com/celery/celery/tree/master/docker

Пожалуйста, следите за файлами, и я думаю, вы можете найти способ сделать свой файл Docker для ваших скриптов Python!

auvipy
источник
-1

Поскольку это отсутствует в других ответах, я хотел бы добавить один совершенно другой аспект:

Модульное тестирование. Или тестирование в целом.

Обычно хорошо иметь одну известную хорошую конфигурацию. В зависимости от того, каковы зависимости программы, вам может потребоваться протестировать различные комбинации пакетов. Вы можете сделать это в автоматическом режиме, например, toxили как часть конвейера CI / CD.

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

Dschoni
источник
Это очень важный аспект разработки программного обеспечения. Тем не менее, это полностью не в состоянии ответить на вопрос . Как модульное тестирование помогает распространению программы?
Легорой
ИМХО, ОП конкретно не спрашивает о раздаче. Он спрашивает, как другие люди могут запустить его программу. Я думаю, что в этом может помочь модульное тестирование, поскольку люди могут быть ограничены в наборе пакетов, которые можно использовать. В целом вопрос распространения важен (и на него уже дан ответ), но я думаю, что в сценарии реального мира мы не можем полагаться на создание целого venv только для одного пакета - он должен быть совместим хотя бы с некоторыми стандартными конфигурациями.
Дшони
Я не спорю , что модульное тестирование является ценным в убедившись , что он работает правильно, но ОП спросил , как разделить код в «легкий установить» моду. Вот почему я думаю, что это неверный ответ - на этот конкретный вопрос.
Legorooj
Я все еще думаю, что вопрос не только в распределении. Вот почему я добавил этот ответ. Если вы разрабатываете, например, на Windows, тестирование на Unix необходимо, если вы хотите убедиться, что оно запускается перед распространением.
дшони
Из любопытства, как отличается от того, что я только что сказал? ... making sure it runs correctly ...? Тестирование является неотъемлемой частью убедившись , что она работает правильно, поэтому это важная часть подготовки распространить его, но он все еще не иметь ничего общего с фактически распределяя его
Legorooj
-1

Я дам вам очень краткое изложение некоторых из существующих доступных решений, когда речь заходит о пакете Python, который вы можете выбрать (знание - сила):

  1. Следуйте инструкциям, приведенным в разделе « Структурирование вашего проекта» , эти соглашения широко приняты сообществом Python, и обычно это хорошая отправная точка, когда новички начинают писать код на Python. Следуя этим рекомендациям, питонисты, следящие за вашим проектом / источником в github или других подобных местах, сразу узнают, как его установить. Кроме того, загрузка вашего проекта в pypi, а также добавление CI, следуя этим правилам, будет безболезненным.

  2. Как только ваш проект структурирован должным образом в соответствии со стандартными соглашениями, следующим шагом может быть использование некоторых из доступных морозильников , в случае, если вы хотите отправить своим конечным пользователям пакет, который они могут установить, не вынуждая их установить Python на своем компьютере. машины. Имейте в виду, что эти инструменты не обеспечат вам никакой защиты кода ... в противном случае извлечение исходного кода Python из конечных артефактов будет тривиальным во всех случаях.

  3. Если вы все еще хотите отправить свой проект пользователям, не заставляя их устанавливать какие-либо зависимости dev, и вы также заботитесь о защите кода, поэтому не хотите рассматривать какие-либо из существующих морозильных камер, вы можете использовать такие инструменты, как nuitka , shedskin , Cython или аналогичные. Обычно обращение кода из артефактов, созданных этими инструментами, совсем не тривиально ... С другой стороны, защита от взлома - это другой вопрос, и если вы не предоставите конечному пользователю физический двоичный файл, вы не сможете сделать многое. об этом, кроме как замедлить их :)

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

Тем не менее, я бы предложил придерживаться пункта 1, поскольку я знаю, что это будет более чем достаточно, чтобы вы начали, а также этот конкретный момент должен охватывать многие из существующих вариантов использования для "стандартных" проектов Python.

Хотя это и не предназначено для того, чтобы быть полным руководством, следуя им, вы сможете опубликовать свой проект на языке python в массы в кратчайшие сроки.

BPL
источник