Как / Можно ли установить python переносимым способом?

Я работаю над скриптом python который выполняет миграцию базы данных mysql с определенной схемой / структурой в базу данных postgresql с другой структурой.

На этапе разработки я работал в виртуальной машине ( CentOS7 ) со всей настройкой моей среды.

В настоящее время я на этапе тестирования, и я впервые запускаю сценарий на реальном сервере, но я уже сталкиваюсь с проблемами, вызванными другой средой (версия python или несовместимость версий python-modules).

Так как мне придется выполнять этот скрипт на многих серверах (все они будут серверами GNU / Linux, большинство из них CentOS, некоторые Debian), я ищу способ интеграции python и всех python-модулей (зависимостей ) прямо в мой скрипт , своего рода портативную версию python, если вы знаете, что я имею в виду.

Например, я хотел бы интегрировать в свой пакет скриптов следующие элементы / двоичные файлы:

  • Python 2.7.5
  • MySQL-разъем-Python-2.1.3-1
  • питон-psycopg2

virtualenv – это, вероятно, то, что вы ищете. См. http://docs.python-guide.org/en/latest/dev/virtualenvs/ :

Виртуальная среда – это инструмент, позволяющий поддерживать зависимости, требуемые различными проектами в разных местах, путем создания для них виртуальных сред Python. Он решает, что «Project X зависит от версии 1.x, но для Project Y требуется 4.x» дилемма, и держит ваш каталог глобальных пакетов сайтов чистым и управляемым.

Установите virtualenv через pip:

 $ pip install virtualenv 

Основное использование

  1. Создайте виртуальную среду для проекта:

     $ cd my_project_folder $ virtualenv venv 

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

    Это создает копию Python в любом каталоге, в котором вы запускали команду, помещая ее в папку с именем venv.

    Вы также можете использовать интерпретатор Python по вашему выбору.

     $ virtualenv -p /usr/bin/python2.7 venv 

    Это будет использовать интерпретатор Python в /usr/bin/python2.7

  2. Чтобы начать использовать виртуальную среду, ее необходимо активировать:

     $ source venv/bin/activate 

    Имя текущей виртуальной среды теперь появится слева от подсказки (например, (venv)Your-Computer:your_project UserName$ ), чтобы вы знали, что она активна. С этого момента любой пакет, который вы устанавливаете с помощью pip, будет размещен в папке venv, изолированной от глобальной установки Python.

    Установите пакеты как обычно, например:

     $ pip install requests 

    Если вы в настоящий момент работаете в виртуальной среде, вы можете деактивировать ее:

     $ deactivate 

Если вы хотите переместить свою среду:

Вы можете составить список установленных пакетов внутри virtualenv:

  $ pip freeze > requirements.txt 

И установите их в виртуальном каталоге назначения, используя:

  $ pip install -r requirements.txt 

По моему опыту, virtualenvs можно создавать и управлять как для python2, так и для python3 (в моей системе у меня есть virtualenv и virtualenv3 )

Обратите внимание, что virtualenv сам не предоставляет интерпретатор python. Он позволяет создавать изолированные среды, в которых уже доступен интерпретатор python.

IMHO, связывая бинарные файлы python с вашим скриптом, не только сделает ваш пакет намного больше, он фактически сделает ваш скрипт менее переносимым, поскольку двоичные файлы будут скомпилированы для конкретной ОС и glibc. Если кто-то захотел использовать скрипт на другой (Linux) ОС / архитектуре, это было бы невозможно, если вы не предоставили пакет для этой версии.