ПИШУ ПРО ВСЕ

5 янв. 2010 г.

Виртуальная среда для Python программ.

  • Как протестировать программы в чистом окружении Python?
  • Вы хотите попробовать программу или библиотеку но нехотите менять текущую установку питона?
  • Как создать несколько различных сред питона для разных задач?

Ответ такой: Виртуальная среда.




Оригинал статьи здесь.

Для этих задач можно использовать несколько решений:

  • Создать полностью изолированную среду при помощи программы virtualenv которая создаст копию вашей текущей установки питона.
  • pyenv - инициализирует виртуальную среду, но при этом будет использовать текущую установленную версию питона.
  • Комбинация virtualenv для создания изолированной среды и активация при запуске програм с помощью pyenv.
  • Поискать другие решения ...

Отличительная особенность pyenv в том что она не только настраивает "sys.prefix" но и устанавливает переменный окружения "$PYTHONPAH" и "$HOME". Если скрипт запущенный с помощью pyenv запустит в свою очередь еще один скрипт, то вновь запущенный получит в наследие установленные переменный среды, что позволит ему видеть виртуальную среду тоже.

Рассмотрим использование pyenv на примере тестирования билиотеки XPyLIB.

Создадим в домашнем каталоге директорию для виртуальной среды:

~$ mkdir ENV
    ~$ mkdir ENV/home
    ~$ mkdir ENV/usr
    ~$ mkdir ENV/temp

  • "ENV" - корневая виртуальная папка.
  • "ENV/home" - виртуальная домашняя папка пользователя.
  • "ENV/usr" - виртуальная директория-префикс (как sys.prefix) для библиотек.
  • "ENV/temp" - временная папка.

Загрузим и распакум библиотеку XPyLIB в директорию "ENV/temp". Для упрощения использования скопируем скрипт "pyenv.py" из "ENV/temp/XPyLIB/XPyTools/scripts/" в вашу домашнюю бинарную директорию "~/bin" и разрешим "pyenv.py" исполнятся.

Теперь мы готовы что бы начать использовать виртуальную среду.

Посмотрим окружение среда ENV при помощи команды:

~$ pyenv.py --env-path ~/ENV/usr --user-home ~/ENV/home --activate-env --add-bin-path --dump

*** PYENV DUMP ***

SYS.PREFIX = "/home/alex/ENV/usr"
PYTHONPATH = "/home/alex/ENV/usr/bin:/home/alex/ENV/usr/lib/dist-packages:/home/alex/ENV/usr/lib/python2.6/dist-packages:
/home/alex/ENV/usr/lib/site-packages:/home/alex/ENV/usr/lib/python2.6/site-packages"
HOME = "/home/alex/ENV/home"
SYS.PATH =
['/home/alex/ENV/usr/bin',
'/home/alex/ENV/usr/lib/python2.6/site-packages',
'/home/alex/ENV/usr/lib/site-packages',
'/home/alex/ENV/usr/lib/python2.6/dist-packages',
'/home/alex/ENV/usr/lib/dist-packages',
'/usr/local/lib/python2.6/dist-packages',
'/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode',
'/usr/lib/pymodules/python2.6/gtk-2.0',
'/usr/lib/python2.6/dist-packages/gtk-2.0',
'/usr/lib/pymodules/python2.6',
'/usr/lib/python2.6/dist-packages/gst-0.10',
'/usr/lib/python2.6/dist-packages/PIL',
'/usr/lib/python2.6/dist-packages/Numeric',
'/usr/lib/python2.6/dist-packages',
'/usr/lib/python2.6/lib-dynload',
'/usr/lib/python2.6/lib-old',
'/usr/lib/python2.6/lib-tk',
'/usr/lib/python2.6/plat-linux2',
'/usr/lib/python2.6',
'/usr/local/lib/python2.6/dist-packages/virtualenv-1.3.3-py2.6.egg']

*** PYENV DUMP END *** 

Использованы следующие опции:
  • "--env-path" - указывает путь виртуальной среды для добавления пакетов в "sys.path".
  • "--user-home" - домашняя папка пользователя - устанавливает переменную среды "$HOME".
  • "--activate-env" - активирует виртуальную среду - настраивает "sys.prefix".
  • "--add-bin-path" - Добавляет бинарные пути ("bin" для *nix, и "scripts" для windows). По умолчанию в питоне эти пути никуда не добавляются.
  • "--dump" - печатает в консоль пути виртуальной среды.

Другие полезные опции:
  • "--remove-path-contain" - удаляет из "sys.path" пути содержащиее указанный путь. Например если у вас есть установленная библиотека XPyLIB в реальном питоне, а вы хотите протестировать новую не меняя старую, то можно ссылку на старую библиотеку удалить командой "--remove-path-contain XPyLIB.
  • "--no-site-packages" - удаляет из "sys.path" все старые (реальнаю установка питона) пути к пакетам.
  • "--add-path" - добавляет дополнительные пути.
  • "--add-site" - добавляет дополнительные пути как "site.addsitedir()".
  • "--exec" или"-c" - выполняет командную строчку (как питон).
  • "--module" или "-m" - выполняет модуль (как питон).
  • "--help" - отображает помощь по командам.

Теперь сменим текущую директорию на директорию с распакованной библиотекой XPyLIB и установим эту самую библиотеку в нашу виртуальную среду ENV.

~$ cd ENV/temp/XPyLIB
~/ENV/temp/XPyLIB$ pyenv.py --env-path ~/ENV/usr --user-home ~/ENV/home --activate-env --add-bin-path setup.py install

... ... ...

~/ENV/temp/XPyLIB$ cd ~
~$ 

Библиотека установилась по следующему пути:

ENV /
   usr /
      lib /
         python2.6 /
            site-packages /
               XPyLIB /
               XPyTools /
               XPyLIB-0.1.2-py2.6.egg-info

После установки выполним команду:

~$ pyenv.py --env-path ~/ENV/usr --user-home ~/ENV/home --activate-env --add-bin-path -c "import XPyLIB; print XPyLIB.dir_root"
/home/alex/ENV/usr/lib/python2.6/site-packages/XPyLIB
~$

Команда отобразит корневой путь куда установлена библиотека XPyLIB: "/home/alex/ENV/usr/lib/python2.6/site-packages/XPyLIB".

Запустим оболочку IDLE в виртуальной среде ENV:

~$ pyenv.py --env-path ~/ENV/usr --user-home ~/ENV/home --activate-env --add-bin-path -m idlelib.idle
... ...

После выхода из IDLE попробуем запустить модуль "timetest" из библиотеки:

~$ pyenv.py --env-path ~/ENV/usr --user-home ~/ENV/home --activate-env --add-bin-path -m XPyLIB.timetest --example
... ...

В виртуальной домашней директории "ENV/home/.xpylib/timetest/current.timetest" можно посмотреть вывод этого модуля.

Комментариев нет:

Отправить комментарий