Pyenv + Tox

pyenv – программа для удобного и быстрого переключения между версиями python. Является адаптицией rbenv и ruby-build для Python.
Pyenv умеет подменять версию python/pip как на уровне системе, т.е. независимо от папки из которой вызывается python, так и определять версии на уровне папки, что очень удобно, так как позволяет для разных проектов указывать разные версии python.
Например, чтобы установить python 2.6.9 исполняем:

Это команда скачивает дистрибутив python 2.6.9 компилирует и инсталирует в папку ~/.pyenv/versions/2.6.6, которая будет содержать папки “bin , include , lib, share” – примерно так, как это делает virtualenv.\


Добавляем путь до pyenv в PATH , а затем активируем его:

После активации в PATH добавляется директория ~/.pyenv/shims. В ней содержатся bash скрипты, каждый из которых “перегружает” соотвествующий вызов команды, например pip или python3.
Вызов pyenv rehash как пробегается по списку установленных версий приложений по работе с python и добавляет в ~/.pyenv/shims соотвествующий скрипт-прослойку. Поэтому после установки новой версии python необходимо вызывать rehash.
Т.е. теперь, грубо говоря, при вызове, например, python3 в консоли на самом деле вызывается скрипт ~/.pyenv/shims/python3, который решает, которую версию интерпретатора следует запустить.
Для выбора версии производится анализ следующих данных в указанном порядка:

  1. Переменной окружения PYENV_VERSION, которую можно выставить либо руками, либо вызовом pyenv shell
  2. Файла .python-version в текущей директории, который можно, опять же, создать руками или же командой pyenv local
  3. Файла .python-version, найденного в ближайшей родительской директории
  4. Файла ~/.pyenv/version. То же самое, что и .python-version, только “глобальный”. Редактируется руками или вызовом pyenv global

pyenv [shell|local|global] в качестве аргумента принимает список версий python. Помимо этого можно использовать служебное слово system, которое соотвествует версии установленной на системе.
Первый аргумент перегружает версию “по умолчанию”, остальные вызываются :

Примечательно, что версии 2.7.х и, к примеру, 2.8.x можно использовать одновременно соотвествующими вызовами pythn2.6 и python2.7, однако, использовать одновременно версии 2.6.8 и 2.6.9 не получится – установить-то их ! можно, однако pyenv не добавляет соотвествующий shim объект python2.6.8 и python2.6.9.

pyenv-virtualenv

Плагин, который позволяет создавать виртуальные окружения, как это делает virtualenv.

  • pyenv virtualenvs – выводит список доступных окружений
  • pyenv virtualenv 3.4.2 myvenv – генерирует окружение на базе python 3.4.2 с названием myenv в соотвествую папку ~/.pyenv/versions/myenv
  • pyenv activate myenv – активирует окружение, как это делает virtualenv. Может понадобится для каких-либо внешних программ, например jedi.
  • pyenv uninstall myenv – удаляет окружение myenv

Виртуальные окружения используются точно также в pyenv [shell|local|global] как и версии python.

 

Интеграция с tox

tox – полезный инструмент для запуска скриптов в разных окружениях в разных версиях python.
Для простого его использования создается конфигурационный файл tox.ini в котором перечисляются необходимые окружения и команда, которую необходимо исполнить в каждом таком окружении. Под окружениями понимаются обыкновенные virtualenv. Команды может быть запуск тестов, исполнения python скрипта и прочее.
В описании тестовой среды мы указываем версию python, а также зависимости, которые необходимо поставить с помощью pip после создания окружения.
Соотвественно, после запуска tox создается директория .tox в которой создается папка для каждого окружения, устанавливается приложения и его зависимости указанные в setup.py, затем tox устанавливает зависимости указанные в в ini-файле в deps и далее запускает указанную команду.
Параметр deps нужен для того, чтобы установить какую-либо зависимость, которая не нужна приложению для работы, но нужна для тех целей, для которых запускается tox. Почти всегда – это отладка, поэтому в моем случае там указывается pytest.
Вот пример tox.ini:

 

Блок [testenv] определяет параметры нашего тестового окружения. В deps указываются (каждая с новой строки) зависимости, которые необходимо установить. commands в данном случае говорит, что необходимо запуститься py.test на файле foo.py. Помимо мы создаем два именованных тестовых окружения py26 и py34, которые определяеются базовую версию python, а также наследует все остальные параметры из [testenv]. Эти названия (py26m py34) передатюся virtualenv в качестве окружения.

 

В итоге после запуска tox:

  1. Выбираются окружения указанные в envlist=name1, name2, …
  2. Ищутся соотвествующие блоки [testenv:name1], [testenv:name2]. Если он не найден – берется только базовый [testenv], если нет – конкретный testenv:name, который наследует все из testenv
  3. Далее для каждого перечисленного в envlist окружения создается virtualenv-ом окружения в одноименной папке в папке .tox
  4. После чего устанавливаются зависимости из deps, после чего из setup.py
  5. Запускается указанная комманда в commands

 

В связи с вышесказанным tox-у абсолютно все равно что вы установили в окружения созданные pyenv-ом. Он создает их заново. Единственно чем помогает pyenv – тем, что помогает установить различные версии python и предоставить их tox-у в конкретной папке.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *