Автономные приложения Python в Linux - PullRequest
29 голосов
/ 11 октября 2008

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

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

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

Ответы [ 8 ]

22 голосов
/ 11 октября 2008

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

11 голосов
/ 26 мая 2009

Вы можете использовать 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, в зависимости от того, сколько работы вы хотите выполнить, насколько гибко вы хотите предлагать требуемые версии и каковы зависимости.

9 голосов
/ 11 октября 2008

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

7 голосов
/ 11 октября 2008

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

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

6 голосов
/ 12 октября 2008

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 $@.tar.gz
    cd $@ && python setup.py install --prefix=..
    rm -rf $@
3 голосов
/ 13 октября 2008

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

Вы можете посмотреть этот учебник или эту страницу о setuptools .

0 голосов
/ 06 января 2010

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

#!/bin/bash
if [ -e /usr/bin/python ]
then
    echo "Python found!"
else
    echo "Python missing!"
fi
0 голосов
/ 11 октября 2008

Нет.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...