Pyenv: удобный менеджер версий python

Появлялась ли у вас хоть когда-нибудь надобность в разделении версий python на одной машине? Думаю ответ вероятнее всего будет положительным. В своей практике программирования я нередко сталкиваюсь с ситуациями, когда мне необходимо иметь под рукой сразу несколько версий Питона, да желательно ещё и самых последних. Обычно в Windows среде с этим никогда не возникает проблем, основная сложность для неподготовленного разработчика появляется при работе в unix-like операционных системах, где собственно и разворачивается большинство python-приложений (будь то веб-приложение или новомодный скрипт, автоматизирующий рутинную работу).

Сегодня я хочу кратко рассказать и показать возможности работы такого замечательного инструмента как pyenv. Данный скрипт ни что иное как удобный менеджер версий для языка программирования Python. Лучше всего сразу всё увидеть на конкретных примерах.

Установка

Pyenv можно установить либо вручную, либо используя автоматический скрипт от того же автора. Я буду использовать автоматическую установку.

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

После этого появится сообщение о том, что необходимо добавить следующие строки кода в .profile / .bash_profile для того, чтобы автоматически обнаруживать pyenv.

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Ах, да. Инструмент располагается в ~/.pyenv/, а все версии будущих интерпретаторов Python будут находиться ~/.pyenv/versions/.
Перед тем как устанавливать определённую версию Python, необходимо предварительно поставить зависимости:

$ sudo apt-get install build-essential
$ sudo apt-get install python-dev libreadline-dev libbz2-dev libssl-dev libsqlite3-dev libxslt1-dev libxml2-dev
$ sudo apt-get install git

Для того чтобы установить определённую версию Питона необходимо выполнить следующую команду:

$ pyenv install 2.7.11
Downloading Python-2.7.11.tgz...
-> https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
Installing Python-2.7.11...
Installed Python-2.7.11 to /home/adylzhan/.pyenv/versions/2.7.11

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

$ pyenv versions
  2.7.11

Чтобы переключиться на версию:


$ pyenv local 2.7.11
$ python
Python 2.7.11 (default, Dec 30 2015, 12:27:30) 
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Создаём отдельное виртуальное окружение Питона из версии 2.7.11 и переключаемся на него:

$ pyenv virtualenv 2.7.11 django_19
Collecting virtualenv
  Downloading virtualenv-13.1.2-py2.py3-none-any.whl (1.7MB)
    100% || 1.7MB 103kB/s 
Installing collected packages: virtualenv
Successfully installed virtualenv-13.1.2
New python executable in /home/adylzhan/.pyenv/versions/2.7.11/envs/django_19/bin/python2.7
Also creating executable in /home/adylzhan/.pyenv/versions/2.7.11/envs/django_19/bin/python
Installing setuptools, pip, wheel...done.
Ignoring indexes: https://pypi.python.org/simple
Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/adylzhan/.pyenv/versions/2.7.11/envs/django_19/lib/python2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /home/adylzhan/.pyenv/versions/2.7.11/envs/django_19/lib/python2.7/site-packages
adylzhan@ubuntu:~$ pyenv versions
* 2.7.11 (set by /home/adylzhan/.python-version)
  2.7.11/envs/django_19
  django_19
$ pyenv local django_19
$ pip install django
Collecting django
  Using cached Django-1.9-py2.py3-none-any.whl
Installing collected packages: django
Successfully installed django-1.9
$ python
Python 2.7.11 (default, Dec 30 2015, 12:27:30) 
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.get_version()
'1.9'
>>>

Список команд pyenv можно увидеть следующим образом:

$ pyenv commands

Мануал по каждой команде:

$ pyenv local --help

Очень удобной фичей pyenv является трекинг версий Питон для конкретных директорий через файл .python-version. Этот файл создаётся каждый раз, если выполняется команда pyenv local. Демонстрация:

$ pyenv local 2.7.11
$ mkdir demo && cd demo && echo "import django;print django.get_version()" > demo.py
~/demo$ pyenv local django_19
/demo$ python demo.py 
1.9
~/demo$ ls -la
total 16
drwxrwxr-x 2 adylzhan adylzhan 4096 Dec 30 12:47 .
drwxr-xr-x 6 adylzhan adylzhan 4096 Dec 30 12:46 ..
-rw-rw-r-- 1 adylzhan adylzhan   41 Dec 30 12:46 demo.py
-rw-rw-r-- 1 adylzhan adylzhan   10 Dec 30 12:47 .python-version
/demo$ cd ..
$ pyenv local 2.7.11
$ cd demo/
/demo$ cat .python-version 
django_19
/demo$ python demo.py 
1.9
/demo$ 

Дополнительные опции для компиляции Python интерпретатора передаются через переменную окружения, например вот так:

PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs4"

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