Настраиваем окружение Python с помощью pyenv, virtualenvwrapper, tox и pip-compile

Автор оригинала: Moshe Zadka
  • Перевод


Эти инструменты упростят настройку и позволит автоматизировать рутинные операции. Они избавят разработчика от многих сложностей, которые мешают сосредоточиться на решении задач и комфортном написании кода.

Есть много способов настройки окружения Python. В этом материале об одном из них. Но это, безусловно, не является единственным решением.

Python — это язык программирования общего назначения, который часто рекомендуют начинающим. За двадцать лет его существования написано несколько книг по Python. Хотя язык часто называют простым, настройка инструментария Python для разработки далеко не самая простая задача.


Настройка окружения Python достаточно сложна: xkcd

Используйте pyenv для управления версиями


На мой взгляд, это лучший менеджер версий Python. Однако стоит отметить, что pyenv работает на Linux, Mac OS X и WSL2: то есть, трёх «UNIX-подобных» средах.

Установка самого pyenv иногда может оказаться непростой. Но может помочь специальный установщик pyenv, который использует curl | bash для начальной загрузки.

Если вы используете Mac (или другую систему, в которой вы запускаете Homebrew), вы можете прочитать инструкции по установке и использованию pyenv здесь.

После установки и настройки pyenv вы можете использовать pyenv global для установки версии Python по умолчанию. Можете выбрать свою «любимую» версию. Обычно это самая последняя стабильная версия, но это не точно -)

Используйте virtualenvwrapper для настройки виртуального окружения


Для Python можно создавать виртуальные окружения, то есть помещать каждый проект в изолированную среду. Это можно сделать с помощью virtualenvwrapper. Тогда появляется возможность переключаться между виртуальными окружениями в любой момент.

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

Если вам нужно многократно создавать и использовать одно и то же виртуальное окружение, имеет смысл автоматизировать процесс. На сегодняшний день мой выбор — это tox.

Используйте tox для автоматизации


Tox — отличный инструмент для автоматизации ваших тестов. В каждом окружении Python я создаю файл tox.ini. Независимо от того, какую систему я использую для непрерывной интеграции, всё будет работать. И я могу запустить его локально с помощью virtualenvwrapper:

$ workon runner
$ tox


Дело в том, что я тестирую свой код на нескольких версиях Python и нескольких версиях библиотечных зависимостей. Это означает, что tox будет работать в нескольких средах. В некоторых из них будут актуальные зависимости. В некоторых — замороженные. Я мог бы также сгенерировать их локально с помощью pip-compile.

В последнее время я рассматриваю nox как на замену tox. В этой статье я не буду объяснять причины, но вам стоит обратить на него внимание.

Используйте pip-compile для управления зависимостями


Python каждый раз загружает свои зависимости на этапе выполнения кода. Понимание и контроль того, какая версия зависимостей используется поможет избежать неожиданных сбоев во время работы программы. Это означает, что мы должны подумать об инструментах управления зависимостями.

Для каждого нового проекта я подключаю файл require.in, который (как правило) содержит только один символ:

.

Да, тут всё правильно. Строка с одной точкой. В файле setup.pyfile для зависимостей я прописываю Twisted> = 17.5 вместо Twisted == 18.1, которая затрудняет обновление до новых версий библиотеки.

«.» означает «текущий каталог», в котором соответствующий файл setup.py используется в качестве источника информации о зависимостях.

Это означает, что при использовании pip-compile requirements.in > requirements.txt будет создан файл с замороженными зависимостями. Вы можете использовать этот файл зависимостей либо в виртуальной среде, созданной virtualenvwrapper, либо в tox.ini.

Иногда может пригодиться файл requirements-dev.txt, сгенерированный из requirements-dev.in (contents: .[dev]) или requirements-test.txt, сгенерированный из requirements-test.in (contents: .[test]).

В качестве альтернативы pip-compile можно использовать dephell. У инструмента dephell есть много интересностей, например, использование асинхронных HTTP-запросов для загрузки зависимостей.

Вывод


Я считаю Python мощным и красивым языком. Тем не менее, чтобы продуктивно работать, я использую определенный набор инструментов, которые доказали свою эффективность, по крайней мере для меня. Поэтому используйте эти четыре инструмента — pyenv, virtualenvwrapper, tox и pip-compile — и будет вам счастье =)



На правах рекламы


Встречайте! Впервые в России — эпичные серверы!
Мощные серверы на базе новейших процессоров AMD EPYC. Частота процессора до 3.4 GHz. Тарифы — от 10 рублей в сутки!

VDSina.ru
Серверы в Москве и Амстердаме

Комментарии 18

    0

    Зачем, если есть pipenv? Сейчас бы в 2к20 начинать проект на такой базе — красота (нет).

      +4
      Или poetry.
        +1
        Добрый день, подскажите, чем плох virtualenv + requirements.txt?
          +3

          Это слишком просто
          сарказм

            0

            Пока вы перечисляете все зависимости (и зависимости зависимостей) указывая их точную версию, может и ничем.
            Но poetry и ему подобные инструменты могут "замораживать" установленные версии пакетов. Poetry записывает эти версии в poetry.lock. Таким образом вы можете воспроизвести установленные зависимости как на любой девелоперской машине, так и в продакшене.

              0
              Но poetry и ему подобные инструменты могут "замораживать" установленные версии пакетов. Poetry записывает эти версии в poetry.lock.

              Так ведь и pip freeze делает то же самое — замораживает текущие установленные версии пакетов. Этого достаточно для того, чтобы воспроизвести окружение позже.


              Другое дело, что в замороженный requirements попадают и зависимости, и зависимости зависимостей вперемешку, что может приводить к конфликтам в будущем, если список этих-самых зависимостей у какого-нибудь пакета изменится, однако на практике лично мне это никогда не мешало — достаточно просто держать отдельно requirements.txt со списком "зависимостей первого уровня" и requirements.freeze.txt для воспроизводимого окружения.

                +1

                А теперь добавьте к этому шаблоны вроде "requirements.dev.txt" и "requirements.dev.freeze.txt" :)


                Я ни в коем случае не оспариваю, что можно обойтись одним pip и virtualenv (идущим из коробки python3 -m venv). Но для меня poetry — это удобный высокоуровневый инструмент, который избавляет от рутины и тем самым уменьшает количество ошибок.

                  +1
                  Другое дело, что в замороженный requirements попадают и зависимости, и зависимости зависимостей вперемешку, что может приводить к конфликтам в будущем, если список этих-самых зависимостей у какого-нибудь пакета изменится, однако на практике лично мне это никогда не мешало — достаточно просто держать отдельно requirements.txt со списком «зависимостей первого уровня» и requirements.freeze.txt для воспроизводимого окружения.

                  Кстати, для этих целей модуль pipdeptree может оказаться весьма полезным.
              +2
              Вот еще бы галочку «Inherit global site-packages» в PyCharm добавили. Два года назад попросил. Только еще один человек к просьбе присоеднился.

              А у меня специфика scientific programming, т.е. куча мелких проектов, и везде нужен малый джентельменский набор numpy/scipy/matplotlib. А numpy/scipy я предпочитаю с MKL, а они поэтому кучу места на диске жрут…
                0
                Посмотрите, возможно Вам поможет моя статья: https://zhauniarovich.com/post/2020/2020-02-configuring-python-workspace/#my-configuration. Суть в том, что Вы можете создать одно pyenv окружение с установленным jupyter, numpy, scipy, matplotlib etc. и использовать его (у меня в отдельном окружении только jupyter установлен).
                  0
                  Так то понятно, что можно. Но вот отнаследоваться от такого виртуального окружения (создать новое с еще одним пакетом, а остальные взять из первого) ведь не получится? А иногда такие кирпичики иметь хочется.
                    0
                    Я сам не пользуюсь PyCharm'ом (использую VSCode), но может PyCharm сможет подхватывать глобальные пакеты из venv окружения, если проставить добавить include-system-site-packages в настройках?
                      0
                      Эта опция говорит о том, чтобы добавить в venv пакеты из python/lib/site-packages и сщщтвтствующего пользовательского каталога. Во-вторых, нафига нужно решение, работающее лишь в IDE, но не в обычной консоли?
                        0
                        Наверное, либо я что-то не понимаю, либо вы не совсем хорошо в теме копались. В консоли перед тем как использовать виртуальное окружение, его надо активировать (например, в моем случае для venv `source bin/activate`). Только что проверил, при активации опции include-system-site-packages вы видите пакеты из версии интерпретатора, который использовался для создания виртуального окружения. Так что можно использовать эту схему следующим образом. Используя pyenv создайте свои окружения, в которые установите ваши MKL зависимости, а потом создавайте виртуальные окружения наследуясь от этих pyenv окружений.
                          0
                          Дошло. Вы говорили про pyenv, я читал pipenv, о котором изначально шла речь. Увы, в Windows pyenv не поддерживатся. а venv/virtualenv/pipenv цепочек не поддерживают.
                            0
                            Я как-то наткнулся на pyenv-win, посмотрите, может покроет потребности и на вашей платформе.
                              0
                              Да я и так обхожусь… Вдобавок, я предпочитаю забирать numpy-MKL и scipy-MKL ручками c www.lfd.uci.edu/~gohlke/pythonlibs, а этот трюк вообще никто не поддерживает.
              +3
              который использует curl | bash для начальной загрузки

              Никогда не делайте три вещи:
              Не используйте конструкции вида curl | bash на своих (а тем более, на чужих) устройствах
              Не пишите и не переводите инструкций/статей без предупреждений, в которых используются конструкции вида curl | bash
              Не рекомендуйте работников/авторов/инструкции/статьи, использующих/использующие конструкции вида curl | bash

              P.S. вспомните меня, если когда лишитесь всех файлов в домашнем каталоге

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

              Самое читаемое