- PVSM.RU - https://www.pvsm.ru -

Менеджер версий python

Иногда полезно держать несколько версий python на одной машине. Допустим для разработки двух проектов нам необходима вторая и третья ветка python. Или вы поддерживаете проект который использует старую версию python.

Обычно для этого мы используем виртуальное окружение virtualenv [1] или же обертку для него virtualenvwrapper [2]. Об этом я рассказывать не буду, так как есть уже много подобных статей, да и в документациях к самим утилитам все очень хорошо объяснено. Достаточно только забить virtualenv или virtualenvwrapper в поисковик.
Но в дополнение к ним я хочу рассказать в этой статье про менеджер версий python. Кому любопытно прошу под кат.

Что бы использовать несколько версий python, можно установить их вручную или воспользоваться менеджер версий. Таких есть два: pythonbrew [3](который более не развивается [4]) и pyenv [5]. Оба менеджера не поддерживают windows(pythonbrew [6], pyenv [7]) так что питонистам пишущим на этой платформе, придется пока разруливать все руками, либо сделать свою утилиту для смены путей до нужных версий. Кто как справляется с данной ситуацией можете оставлять в комментариях.
Так как pythonbrew более не поддерживается в этой статье он рассмотрен не будет.

P.S. В статье приведены примеры проверенные для OS Ubuntu [8] 12.04. При попытке повторить их, делайте поправки относительно своего дистрибутива.

Ручной способ

Для того что бы работать с несколькими версиями питона, можно установить необходимые версии в указанный префикс. Например что бы не мудрить с правами, установим дополнительно 2 версии python(2.7.6 и 3.3.2) в директорию пользователю:
2.7.6

$ mkdir -p ~/python/src/ && cd ~/python/src/
$ wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz
$ tar -xf ~/python/src/Python-2.7.6.tar.xz && cd ./Python-2.7.6
$ ./configure --prefix=$HOME/python/2.7.6/
$ make && make install

для 3.3.2 делаем аналогичные операции:

$ wget http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz ~/python/src/
$ tar -xf ~/python/src/Python-3.3.2.tar.xz && cd ./Python-3.3.2
$ ./configure --prefix=$HOME/python/3.3.2/
$ make && make install

Теперь можно создать виртуальное окружение что бы использовать эти версии:

$ virtualenv -p ~/python/2.7.6/bin/python env && . ./env/bin/activate

или через virtualenvwrapper:

$ mkvirtualenv -p ~/python/2.7.6/bin/python evnwrapper

Собственно на основании такого способа описана статья по созданию мультихостинга [9].
Далее если вам необходимо использовать какую-то из этих версий как python по умолчанию, то вам необходимо добавить в переменную окружения путь до интерпретатора python.

$ echo 'export PATH=~/python/2.7.6/bin/' >> ~/.bashrc

Соответственно вместо bashrc вы ставите bash_profile, zshrc, kshrc, profile в зависимости от вашей командной оболочки.

$ . ~/.bashrc

И по необходимости можно установить pip [10], предварительно установив setuptools [11].

$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python
$ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py -O - | python

Фух, ну вроде бы все. А теперь о том как можно сделать это проще использую менеджер версий python.

PyEnv

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

Так в чем же заключается особенность этой утилиты? Вот что она может со слов автора проекта:

  • Let you change the global Python version on a per-user basis.
  • Provide support for per-project Python versions.
  • Allow you to override the Python version with an environment variable.
  • Search commands from multiple versions of Python at a time. This may be helpful to test across Python versions with tox [12].

По умолчанию все версии Python будут доступны в ~/.pyenv/versions/. Изменять версии Python можно как в глобальном контексте так и в локальном(например под конкретный проект).

Как ставить pyenv хорошо описывается в инструкции [13]. Так же у автора есть скрипт [14] который по мимо самой pyenv ставит еще и дополнительные плагины, в том числе и для virtualenv [15]. Есть возможность установить плагин и для virtualenvwrapper [2].

Перед установкой необходимо поставить некоторые зависимости [16]:

# apt-get install make libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev

Прежде чем начать установку, убедитесь, что у вас установлен git:

# apt-get install git

Далее устанавливаем по инструкции [13]:

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

Или так:

$ curl https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

Во втором случае установка произойдет с дополнительными плагинами.
Далее, для того что бы все заработало, дополним наш bashrc и перезагрузим оболочку:

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ . ~/.bashrc

Для обновления утилиты или смены ее версии используем git.

Инструкция

Для управления версиями pyenv необходимо перейти в директорию с утилитой:

$ cd ~/.pyenv

Для просмотра доступных версий:

$ git tag

для смены версии

$ git checkout <version>

для обновления

$ git pull

Пример использования

~ $ pyenv install 2.7.5
~ $ pyenv install 3.3.2
~ $ pyenv rehash
~ $ pyenv versions
* system
  2.7.5
  3.3.2
~ $ pyenv global 2.7.5
~ $ python --version
Python 2.7.5
~ $ cd projects/
~/projects $ pyenv local 3.3.2
~/projects $ python --version
Python 3.3.2
~/projects $ cd test_prj/
~/projects/test_prj $ python --version
Python 3.3.2
~/projects/test_prj $ cd ..
~/projects $ pyenv local --unset
~/projects $ python --version
Python 2.7.5

В добавок ко всему все довольно подробно и детально расписано у автора проекта в его репозиториях на github [17].

Виртуальное окружение

Все, а дальше как хотите. Если вы используете 3 ветку python то для создания виртуального окружения можно воспользоваться утилитой venv [18] которая работает из коробки. Про это есть статья [19] на хабре. Если вы больше привыкли к virtualenv [20] или ее обертке virtualenvwrapper [21] то тут есть два варианта: либо поставить плагин к pyenv, или использовать их к той версии python c которой вы работаете. Соответственно если выбрать первый вариант, то созданные вами окружения будут добавлены к вашим версиям python и доступны через команду:

$ pyenv versions

Добавить плагин легко, просто клонируем его из репозитория pyenv-virtualenv [15] или pyenv-virtualenvwrapper [2]:

$ mkdir -p ~/.pyenv/plugins
$ git clone git://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
$ git clone git://github.com/yyuu/pyenv-virtualenvwrapper.git ~/.pyenv/plugins/pyenv-virtualenvwrapper

Пример использования можно посмотреть в документации для pyenv-virtualenv [22] и pyenv-virtualenvwrapper [23].
Все, а дальше пользуйтесь, как вам привычнее.

Пример использования

$ pyenv versions
* system
  2.7.5
  3.3.2

$ mkdir -p ~/test_project/prj_for_2.7.5 && cd ~/test_project/prj_for_2.7.5
$ pyenv virtualenv 2.7.5 my-virtualenv-2.7.5
$ pyenv local my-virtualenv-2.7.5
$ pip install django==1.4
$ pip freeze
Django==1.4
wsgiref==0.1.2
$ python --version
Python 2.7.5

$ mkdir -p ~/test_project/test_project && cd ~/test_project/test_project
$ pyenv virtualenv 3.3.2 my-virtualenv-3.3.2
$ pyenv local my-virtualenv-3.3.2
$ pip install django==1.5
$ pip freeze
Django==1.5
$ python --version
Python 3.3.2

Теперь находясь в директории проекта можно запускать скрипт от нужной версии python не прилагая никаких действий. pyenv создает в директории файл .python-version который содержит в себе информацию о том какую версию python с каким окружение использовать для данного проекта.

Полезные ссылки

github.com/utahta/pythonbrew [3]
github.com/yyuu/pyenv [5]
github.com/yyuu/pyenv-installer [24]
github.com/yyuu/pyenv-virtualenv [15]
github.com/yyuu/pyenv-virtualenvwrapper [2]
docs.python.org/dev/library/venv.html [18]
www.virtualenv.org/en/latest/ [20]
virtualenvwrapper.readthedocs.org/en/latest/ [21]

Автор: prokoptsev

Источник [25]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/49176

Ссылки в тексте:

[1] virtualenv: http://www.virtualenv.org/

[2] virtualenvwrapper: https://github.com/yyuu/pyenv-virtualenvwrapper

[3] pythonbrew: https://github.com/utahta/pythonbrew

[4] более не развивается: https://github.com/utahta/pythonbrew#deprecated

[5] pyenv: https://github.com/yyuu/pyenv

[6] pythonbrew: https://github.com/utahta/pythonbrew/issues/6

[7] pyenv: https://github.com/yyuu/pyenv/issues/62

[8] OS Ubuntu: http://ru.wikipedia.org/wiki/Ubuntu

[9] созданию мультихостинга: http://habrahabr.ru/post/179831/

[10] установить pip: http://www.pip-installer.org/en/latest/installing.html

[11] setuptools: https://pypi.python.org/pypi/setuptools#installation-instructions

[12] tox: http://pypi.python.org/pypi/tox

[13] инструкции: https://github.com/yyuu/pyenv#installation

[14] скрипт: https://github.com/yyuu/pyenv-installer/blob/master/bin/pyenv-installer

[15] virtualenv: https://github.com/yyuu/pyenv-virtualenv

[16] поставить некоторые зависимости: https://github.com/yyuu/pyenv/wiki/Common-build-problems#requirements

[17] репозиториях на github: https://github.com/yyuu/

[18] venv: http://docs.python.org/dev/library/venv.html

[19] статья: http://habrahabr.ru/post/157287/

[20] virtualenv: http://www.virtualenv.org/en/latest/

[21] virtualenvwrapper: http://virtualenvwrapper.readthedocs.org/en/latest/

[22] pyenv-virtualenv: https://github.com/yyuu/pyenv-virtualenv#usage

[23] pyenv-virtualenvwrapper: https://github.com/yyuu/pyenv-virtualenvwrapper#usage

[24] github.com/yyuu/pyenv-installer: https://github.com/yyuu/pyenv-installer

[25] Источник: http://habrahabr.ru/post/203516/