Создание портативного Python (локальная установка) для Linux

Я хочу создать следующее:

Портативная версия python, которая может быть запущена в любой системе (с любой предыдущей версией python или без установки python) и предварительно настроена с различными пакетами python (например, django, lxml, pysqlite и т.д.)

Ближайший, который я нашел выше, virtualenv, но это только до сих пор.

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

Чтобы запустить python на другой машине, я использую:

LD_LIBRARY_PATH=lib/ ./bin/python

а в lib/у меня есть все общие библиотеки, которые я скопировал с оригинальной машины. Проблема здесь в том, что эти общие библиотеки могут полагаться на другие разделяемые библиотеки, которые я не включаю, поэтому выполнение этого на других дистрибутивах Linux не работает. Вероятно, из-за того, что он возвращается к старым общим библиотекам, установленным в системе, которые не работают с тем, что я скопировал.

У кого-нибудь есть идея, как это сделать? Возможно ли это?

EDIT:

Чтобы уточнить, желаемый результат заключается в создании tar.gz двоичных и связанных пакетов python (django, lxml, pysqlite и т.д.), которые могут быть извлечены и запущены в любой системе на основе Linux, то есть (ubuntu 8.04, redhat 5, suse 11 и т.д.), Все 32-битные дистрибутивы, где локально установленная версия python не влияет на то, что в tar.gz.

Ответ 1

Я просто испытал это, и он отлично работает.

Получите копию python, которую вы хотите установить, и сначала распакуйте ее, и cd в неракурсированную папку.

Также получите копию setuptools и отпустите это.

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

mkdir /opt/portapy
cd <python source dir>
./configure --prefix=/opt/portapy && make && make install
cd <setuptools source dir>
/opt/portapy/bin/python ./setup.py install

Сделайте папку виртуального env внутри папки portapy.

mkdir /opt/portapy/virtenv
/opt/portapy/bin/virtualenv /opt/portapy/virtenv
cd /opt/portapy/virtenv
source bin/activate

Готово. Вы готовы установить все свои библиотеки здесь и имеете возможность создавать несколько виртуальных envs таким образом.

Затем вы можете выполнить таргетинг всей папки /opt/portapy и перенести ее в любую систему Linux той же арки, по какой-то причине я подозреваю.

Я скомпилировал 2.7.5 ond centOS 5.8 64bit и переместил папку в систему Cent6.9 и отлично работает.

Ответ 2

Я не знаю, как это возможно. Если это так, им не нужно распространять двоичные пакеты python для разных платформ. Вы не можете просто распространять python, который будет работать на любой платформе. Он должен быть построен из источника для этой арки. Virtualenv ожидает, что вы скажете, какой системный питон использовать (используя ссылки).

Это в значительной степени касается почти любого двоичного пакета, который связывается с системными libs. Опять же, если это было возможно, нам не нужны никакие бинарные дистрибутивы, специфичные для платформы.

Однако вы можете достичь части того, что хотите. То есть, запуск python на другой машине, на которой не установлен python, пока существует одна и та же арка. Это та же концепция, что и "замораживание" или py2exe/py2app/pyinstaller. Интерпретатор входит в автономную среду. Таким образом, приложение может работать на любой подобной платформе.

Edit

Я просто понял, что, хотя ваш вопрос говорит об "системе" агностически, ваш заголовок содержит ссылку "linux". Существуют различные варианты linux, поэтому для того, чтобы он работал, вам нужно было бы построить его для нескольких арков, а также полностью содержать автономные ссылки. Вы можете попробовать создать пакет с pyinstaller и использовать его для включения в свой проект.

Вы можете попробовать просто построить python из источника, в вашем virtualenv:

$ ./configure --prefix=/path/to/virtualenv && make && make install

Если у вас все еще есть проблемы со ссылками на libs, вы также можете исследовать его статическое построение

Ответ 3

Я не уверен, что работать исключительно на Python - это путь сюда. Возможно, вам повезло с Puppet of Chef, которые являются инструментами настройки, которые можно использовать для создания локальной среды. Существует множество кода для установки virtualenv и python практически на любой Linux плюс OSX (возможно, не на Windows, хотя).

Ваш рабочий процесс должен был установить chef или Puppet (ваш выбор), запустите script, чтобы установить Python, который вы хотите, затем введите virtualenv и pip, чтобы установить любые пакеты, которые могут вам понадобиться.

Извините, это не так просто, как virtualenv в одиночку, но он гораздо более надежный.

Ответ 4

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

Вам нужно будет определить стандартное расположение этого каталога верхнего уровня. Во-вторых, используя этот каталог в качестве корня, вам нужно будет скомпилировать Python для каждого дистрибутива Linux, на котором вы хотите его запустить. Для этого вы должны использовать что-то вроде "/usr/local/myappname/platform/" для настройки и компиляции Python для жизни. В каждом случае заменить "платформу" на имя платформы, например "/usr/local/rhel/". Если в памяти используется параметр configure, который вы ищете, это --prefix.

После того, как каждый дистрибутив будет скомпилирован, вам понадобится script, чтобы определить, какой из них использовать и либо установить переменные среды, либо создать символические ссылки на соответствующую "установку" python. Затем я использовал бы virtualenv и bootstrap в этом дереве, чтобы еще больше учесть "in-use" библиотеки python.

Я не могу придумать общий дистрибутив Linux, который по умолчанию не имеет Python. Таким образом, вы можете использовать setup.py и/или базовые сценарии python для script, так как вы должны иметь возможность полагаться на присутствующий Python - даже если его устаревшая версия, как в RHEL, установлена. Лично я считаю, что вышеуказанный метод слишком сложный, но он будет соответствовать вашим заявленным требованиям с учетом окончательного script. Конечно, вы можете использовать shar (SHell ARchive) для tar все это в runnable shell script, чтобы выполнить установку и избежать необходимости в дополнительных скриптах. Если вы gzip результирующий архив стека, вы можете распаковать его в целевых системах и выполнить его, чтобы настроить все.

Все, что сказал, я бы не рекомендовал этого. Я бы рекомендовал определить минимальную версию Python, на которой вы можете запускать, и обеспечить, чтобы она была установлена ​​дистрибутивом, когда это возможно, и, если это необходимо, сбрасывать с репо и устанавливать. Затем используйте virtualenv и bootstrap с требованиями .txt для установки необходимых библиотек и приложений python в virutalenv. Для этого см. эту документацию