Автономные приложения Python в Linux

Как я могу распространять автономное приложение Python в Linux?

Я думаю, что могу считать само собой разумеющимся наличие недавнего интерпретатора Python в любом современном дистрибутиве. Проблема связана с теми библиотеками, которые не принадлежат к стандартной библиотеке, то есть wxPython, scipy, python cryptographic toolkit, reportlab и т. д.

Есть ли рабочий аналог для Linux, скажем, py2exe (который, кстати, я никогда не пробовал)? Есть ли бесплатная версия с открытым исходным кодом?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
30
0
26 088
8

Ответы 8

Неа.

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

Обновление 2019: я поддерживаю это. Virtualenv - это способ объединения библиотек и интерпретаторов вместе. Tox - это инструмент тестирования для проверки этой матрицы интерпретатора / зависимостей. Docker - это широко используемый способ развертывания пакета.

Это не было моим опытом. Конечно, вы можете неправильно настроить сторонние библиотеки или даже неправильно установить python, но, как правило, у меня никогда не было проблем со стандартными программами на Python. За исключением, конечно, перехода на предыдущую версию, когда вы использовали новые функции :). Возможно, вы думали о Java (tm)?

A. L. Flanagan 06.01.2010 16:20

@ A.L.Flanagan: На самом деле, несмотря на всю ненависть к Java, я обнаружил, что она довольно надежна в отношении распространения программного обеспечения.

Marcin 25.01.2012 15:51

Может быть, есть лучший ответ, но я думаю, что он актуален для людей. На самом деле это первое, что вам следует сказать, когда у вас возникнет этот вопрос: «Ну ... нет простого решения, вам придется иметь дело со всеми этими настройками и инструментами».

Philippe Carphin 17.02.2019 14:37

Вы не можете легко сделать это в формате, нейтральном к распространению. Единственные надежные механизмы отслеживания зависимостей встроены в системы управления пакетами в дистрибутивах и будут отличаться от дистрибутива к дистрибутиву. Фактически вам нужно будет сделать rpm для Fedora, debs для ubuntu и debian и т. д.

Py2exe отлично работает в Windows. Он создает дистрибутив со всеми необходимыми DLL и оболочкой для интерпретатора python, запускающего вашу программу. Его довольно просто установить - просто поместите его в каталог, поэтому создать для него msi-файл несложно.

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

Я знаю, что @ S.Lott знает это, но для других: это отличный способ распространить библиотеку или приложение Python среди других разработчиков, которые не будут возражать против того, чтобы самому установить правильную версию Python, прежде чем ваше приложение будет работать. Но это абсолютно неправильный способ распространения среди конечных пользователей, которые не знают, что такое Python, абсолютно НЕ БУДЕТ идти и устанавливать его, чтобы ваше приложение работало, а для 0,2%, которые это делают, они установят неправильный версия.

Jonathan Hartley 21.08.2015 10:45

Создайте deb (для всего, что происходит от Debian) и rpm (для Fedora / SuSE). Добавьте правильные зависимости в упаковку, и вы можете быть уверены, что она будет работать.

Меня привлекает идея создания deb или rpm как «правильного способа» для упаковки в Linux, но проблема с ним как с решением заключается в следующем: (a) Вы должны проделать работу три раза (один раз для deb, один раз для rpm, один раз для выпуска исходного кода для других дистрибутивов), а затем вы должны сделать это СНОВА для других платформ (Windows, OSX). Почему бы просто не использовать PyInstaller, который работает со всем вышеперечисленным?

Jonathan Hartley 21.08.2015 00:42

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

Я собираю «сторонний» каталог, который включает все необходимые компоненты, и использую site.addsitedir, поэтому их не нужно устанавливать глобально.

# program startup code
import os
import sys
import site
path = os.path.abspath(os.path.dirname(__file__))
ver = 'python%d.%d' % sys.version_info[:2]
thirdparty = os.path.join(path, 'third-party', 'lib', ver, 'site-packages')
site.addsitedir(thirdparty)

У большинства моих предварительных требований есть установщики setup.py. Каждый связанный модуль получает свой собственный процесс «установки», поэтому любые настраиваемые компоненты (например, ./configure) могут запускаться автоматически. Мой сценарий установки запускает этот make-файл как часть процесса установки.

# sample third-party/Makefile
PYTHON_VER = `python -c "import sys; \
        print 'python%d.%d' % sys.version_info[:2]"`
PYTHON_PATH = lib/$(PYTHON_VER)/site-packages
MODS = egenix-mx-base-3.0.0 # etc

.PHONY: all init clean realclean $(MODS)
all: $(MODS)
$(MODS): init
init:
    mkdir -p bin
    mkdir -p $(PYTHON_PATH)
clean:
    rm -rf $(MODS)
realclean: clean
    rm -rf bin
    rm -rf lib

egenix-mx-base-3.0.0:
    tar xzf [email protected]
    cd $@ && python setup.py install --prefix=..
    rm -rf $@

Стандартный способ питона - создать питон «Яйцо».

Вы можете взглянуть на этот учебник или эта страница об инструментах настройки.

Для этого вы можете использовать cx_Freeze. Это похоже на py2exe (объединяет интерпретатор и сценарий запуска, а также все необходимые библиотеки и модули), но работает как в Linux, так и в Windows.

Он собирает зависимости из среды, в которой он запущен, а это означает, что они также должны подходить для места назначения. Если вы делаете что-то вроде создания на 32-битном Debian и развертывания на другом 32-битном Debian, то это нормально. Вы можете справиться с 32- и 64-битными различиями, создав несколько версий в соответствующих средах (например, 32-битные и 64-битные chroot-файлы) и распространив соответствующую. Если вам нужно что-то более общее (например, сборка на Debian, развертывание в любом дистрибутиве), это становится немного неясным, в зависимости от того, какие именно ваши зависимости.

Если вы делаете довольно простое распространение (то есть знаете, что ваша среда сборки и среда развертывания похожи), тогда это позволяет избежать довольно сложного шага rpm / deb / egg / etc (использовать cx_Freeze очень просто, особенно если вы знаком с py2exe). Если нет, то все, от развертывания вашего собственного установщика зависимостей до сборки deb / rpm / egg / etc, будет работать, в зависимости от того, сколько работы вы хотите выполнить, насколько гибкости с требуемыми версиями вы хотите предложить, и каковы зависимости.

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

#!/bin/bash
if [ -e /usr/bin/python ]
then
    echo "Python found!"
else
    echo "Python missing!"
fi

Другие вопросы по теме