Пользователь
0,0
рейтинг
25 ноября 2013 в 12:41

Разработка → Менеджер версий python из песочницы tutorial

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

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

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

P.S. В статье приведены примеры проверенные для OS Ubuntu 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

Собственно на основании такого способа описана статья по созданию мультихостинга.
Далее если вам необходимо использовать какую-то из этих версий как python по умолчанию, то вам необходимо добавить в переменную окружения путь до интерпретатора python.
$ echo 'export PATH=~/python/2.7.6/bin/' >> ~/.bashrc

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

И по необходимости можно установить pip, предварительно установив setuptools.
$ 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.

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

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

Перед установкой необходимо поставить некоторые зависимости:
# apt-get install make libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev

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

Далее устанавливаем по инструкции:
$ 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.

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


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

Добавить плагин легко, просто клонируем его из репозитория pyenv-virtualenv или pyenv-virtualenvwrapper:
$ 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 и pyenv-virtualenvwrapper.
Все, а дальше пользуйтесь, как вам привычнее.

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

$ 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
github.com/yyuu/pyenv
github.com/yyuu/pyenv-installer
github.com/yyuu/pyenv-virtualenv
github.com/yyuu/pyenv-virtualenvwrapper
docs.python.org/dev/library/venv.html
www.virtualenv.org/en/latest
virtualenvwrapper.readthedocs.org/en/latest
Алексей @prokoptsev
карма
5,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (6)

  • +2
    Для убунты еще есть PPA с разными версиями питона: deadsnakes.
  • 0
    Это RVM, только для Python получается. Наконец-то :) Сам хотел такую штуку написать
    • +2
      Это rbenv для python. На github'e это явно написано.
  • 0
    В копилку, еще менеджер virtualenv'ов: PEW
  • 0
    Оказывается, даже и такие проблемы бывают…
    Ну, допустим, в ubuntu, действительно, нету. Но неужели аналогов слотов от emerge нигде больше не придумали?
    • 0
      Расскажите, как вы, используя слоты, получите debug и нормальную сборку python-2.7.5 на одной машине?

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