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






Неа.
Python, как известно, нестабилен в отношении различных настроек. Единственный разумный способ развернуть приложение Python - это отправить весь пакет интерпретатора и библиотек, на которые вы полагаетесь в своем коде. Скорее всего, это сработает.
Обновление 2019: я поддерживаю это. Virtualenv - это способ объединения библиотек и интерпретаторов вместе. Tox - это инструмент тестирования для проверки этой матрицы интерпретатора / зависимостей. Docker - это широко используемый способ развертывания пакета.
@ A.L.Flanagan: На самом деле, несмотря на всю ненависть к Java, я обнаружил, что она довольно надежна в отношении распространения программного обеспечения.
Может быть, есть лучший ответ, но я думаю, что он актуален для людей. На самом деле это первое, что вам следует сказать, когда у вас возникнет этот вопрос: «Ну ... нет простого решения, вам придется иметь дело со всеми этими настройками и инструментами».
Вы не можете легко сделать это в формате, нейтральном к распространению. Единственные надежные механизмы отслеживания зависимостей встроены в системы управления пакетами в дистрибутивах и будут отличаться от дистрибутива к дистрибутиву. Фактически вам нужно будет сделать rpm для Fedora, debs для ubuntu и debian и т. д.
Py2exe отлично работает в Windows. Он создает дистрибутив со всеми необходимыми DLL и оболочкой для интерпретатора python, запускающего вашу программу. Его довольно просто установить - просто поместите его в каталог, поэтому создать для него msi-файл несложно.
Вы можете посмотреть объявления зависимостей в setuptools. Это может обеспечить способ гарантировать, что нужные пакеты либо доступны в среде, либо могут быть установлены кем-то с соответствующими привилегиями.
Я знаю, что @ S.Lott знает это, но для других: это отличный способ распространить библиотеку или приложение Python среди других разработчиков, которые не будут возражать против того, чтобы самому установить правильную версию Python, прежде чем ваше приложение будет работать. Но это абсолютно неправильный способ распространения среди конечных пользователей, которые не знают, что такое Python, абсолютно НЕ БУДЕТ идти и устанавливать его, чтобы ваше приложение работало, а для 0,2%, которые это делают, они установят неправильный версия.
Создайте deb (для всего, что происходит от Debian) и rpm (для Fedora / SuSE). Добавьте правильные зависимости в упаковку, и вы можете быть уверены, что она будет работать.
Меня привлекает идея создания deb или rpm как «правильного способа» для упаковки в Linux, но проблема с ним как с решением заключается в следующем: (a) Вы должны проделать работу три раза (один раз для deb, один раз для rpm, один раз для выпуска исходного кода для других дистрибутивов), а затем вы должны сделать это СНОВА для других платформ (Windows, OSX). Почему бы просто не использовать PyInstaller, который работает со всем вышеперечисленным?
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
Это не было моим опытом. Конечно, вы можете неправильно настроить сторонние библиотеки или даже неправильно установить python, но, как правило, у меня никогда не было проблем со стандартными программами на Python. За исключением, конечно, перехода на предыдущую версию, когда вы использовали новые функции :). Возможно, вы думали о Java (tm)?