Рубрики
Без рубрики

Управление пакетами в Python II

Pyenv и pipenv

Автор оригинала: Mariusz Masztalerczuk.

Этот пост был первоначально опубликован на http://snoozy.ninja/.

Python – это “самый мощный язык, который вы все еще можете читать” – Поль Дю Буа

В предыдущем посте Я обсуждал такие инструменты, как pip и virtualenv . Благодаря им мы можем легко устанавливать необходимые нам библиотеки в изолированных средах. Эти основные инструменты управления пакетами в большинстве случаев достаточны для решения стандартных задач. Благодаря им мы можем легко установить, удалить или обновить пакет. Virtualenv позволяет нам легко обойти проблему хранения разных версий пакетов в одной системе.

1*wU6oJH7v7wkGRrhwA9XRVA.jpeg

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

  • Как управлять разными версиями интерпретатора в одной системе?
  • Как придерживаться зависимостей более читаемым (и безопасным) способом, чем requirements.txt?
  • Как управлять большим количеством виртуальных сред простым способом?

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

Pyenv -это простой в использовании инструмент, который используется для установки, удаления и управления различными версиями интерпретатора Python в вашей системе. Используя простой интерфейс, мы можем без проблем менять версии интерпретатора для нашего компьютера (тот, кто пытался удалить python 2.7 из ubuntu и заменить его версией 3, знает, о чем я говорю). Кроме того, автоматически pyenv гарантирует, что другие команды, связанные с нашим интерпретатором, такие как pip , ссылаются на свои аналоги.

Сам процесс установки pyenv не так прост, как другие инструменты, перечисленные здесь (тем более, что мы привыкли использовать pip каждый день ) Это в основном связано с тем, что pyenv-это инструмент, написанный в основном на bash . Однако весь процесс установки не является сложным, и, помимо копирования файлов, он также требует небольших изменений в нашем .bashrc (или эквиваленте, используемом нами). Давайте посмотрим, как выглядит help :

❯ pyenv help                                                                                             mmasztalerczuk.github.io/git/master 
Usage: pyenv  []

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

Давайте посмотрим, какие версии мы установили и используем другую версию Python.

Давайте посмотрим, какие версии мы установили и используем другую версию Python.

Используя pyenv версии мы можем проверить, какие версии интерпретатора в настоящее время находятся под нашим контролем pyenv (все поддерживаемые версии можно найти с помощью pyenv install --list ). Интерпретатор изменяется с помощью pyenv global x (где x-версия, которую вы хотите использовать). Принцип работы pyenv довольно прост. Когда мы вводим команду, например python , наш терминал начинает искать исполняемый файл в местах, которые были указаны в переменной окружения PATH . Pyenv просто изменяет эту переменную, добавляя некоторые папки в самое начало переменной PATH, в которых она содержит так называемые shims файлы.

ПУТЬ=/home/mariusz/.pyenv/shims:/home/mariusz/.pyenv/bin:/usr/local/bin:/usr/local/sbin

В папке с именем shims есть очень маленькие скрипты , которые называются точно так же, как исполняемые файлы (например, python ). Поскольку название одно и то же, наша оболочка рассматривает их как то, что мы хотим найти. Они анализируют аргументы и пересылают их, запустив pyenv , который, используя переменные среды, принимает решение о версии интерпретатора. Весь процесс более подробно описан в документации, и я рекомендую вам прочитать его, потому что это довольно интересное решение проблемы.

Благодаря этому методу мы можем легко использовать многие версии python с минимальной работой.

Piper nv является самым новым из перечисленных мною инструментов (что означает, что разработка этого инструмента активна и новые функции появляются постоянно). Pipenv-это инструмент, который объединяет pip и virtualenv в один . Кроме того, он поддерживает файл Pip, помогает управлять переменными среды путем автоматической загрузки файлов .env (очень популярное решение для хранения значений переменных среды). Кроме того, он поддерживает pyenv , что означает, что при создании среды мы можем автоматически установить интересующую нас версию Python.

Процесс установки прост, и вы можете установить pip с помощью pip (а затем забыть, что существует что-то вроде pip ). Давайте посмотрим, как выглядит help , и кратко обсудим предоставляемые нам функциональные возможности (я перешел к самому важному фрагменту):

Commands:
  check      Checks for security vulnerabilities and against PEP 508 markers
             provided in Pipfile.
  clean      Uninstalls all packages not specified in Pipfile.lock.
  graph      Displays currently–installed dependency graph information.
  install    Installs provided packages and adds them to Pipfile, or (if none
             is given), installs all packages.
  lock       Generates Pipfile.lock.
  open       View a given module in your editor.
  run        Spawns a command installed into the virtualenv.
  shell      Spawns a shell within the virtualenv.
  sync       Installs all packages specified in Pipfile.lock.
  uninstall  Un-installs a provided package and removes it from Pipfile.
  update     Runs lock, then sync.
Виртуальные среды

Чтобы создать новую рабочую среду, мы начнем с выполнения, например, команды piper nv --python 3.6 . Если мы установили pyenv, то в случае проблем с отсутствием конкретной версии интерпретатора, pipenv позаботится о его загрузке и установке . Однако новая виртуальная среда, которая будет создана по умолчанию, будет находиться не в папке проекта, а в папке standard (дополнительные сведения об этом разделе см. в документации). Для меня это путь .local/share/virtualenvs . Это поведение можно изменить, правильно установив флаг “PIPER NV_VNV_IN_PROJECT”, после чего виртуальная среда будет создана в той же папке, что и проект. В общем, я рекомендую прочитать список переменных среды, которые использует pipenv , потому что он довольно большой и дает нам много возможностей для настройки поведения приложения.

Чтобы создать новую рабочую среду, мы начнем с выполнения, например, команды || piper nv --python 3.6||. Если мы установили pyenv, то в || случае проблем с отсутствием конкретной версии интерпретатора, pipenv позаботится о его загрузке и установке || . Однако новая виртуальная среда, которая будет создана по умолчанию, будет находиться не в папке проекта, а в папке || standard || (дополнительные сведения об этом разделе см. в документации). Для меня это путь || .local/share/virtualenvs || . Это поведение можно изменить, правильно установив флаг

Стоит обратить внимание на имя папки с виртуальной средой piper nv_blog-ldLvq6-K . Имя было создано в сочетании с именем папки и хэшем пути к проекту. Имя было построено таким образом, чтобы однозначно идентифицировать виртуальную среду для нашего проекта . Это решение, которое помогает нам в ситуации, когда у нас больше проектов с одинаковым названием. На данный момент управление виртуальными средами все еще немного проблематично. Особенно, когда дело доходит до удаления неиспользуемых папок. Мы можем удалить среду с помощью команды pipe nv --rm , но мы должны находиться в папке проекта, который является владельцем этого виртуального env. Это стандартное решение и, к сожалению, имеет один недостаток.

Вы должны помнить об этом перед удалением проекта с диска. Иногда, если мы хотим перестроить среду, мы удалим папку с проектом, а затем создадим ее снова (например, выполнив git clone ). К сожалению, в этом сценарии по-прежнему будет использоваться старая среда, поскольку путь и имя не были изменены. Вторая проблема также может заключаться в том, что потенциальное изменение имени папки или перемещение ее в другое место не приведет автоматически к использованию существующей виртуальной среды. Мы должны будем помнить, что необходимо удалить их и создать новые.

Сами среды могут быть просто удалены вручную из того места, где они хранятся, или мы можем использовать инструмент pew . Он автоматически устанавливается вместе с pipenvem и используется им для управления пакетами. С помощью fowls мы можем проверить , какие у нас в настоящее время установлены среды, а затем использовать pwm для удаления тех, которые больше не кажутся необходимыми.

Риплок

Установка пакета так же проста. Все сводится к команде pipenv install mypy . Я покажу пример, в котором мы установим два пакета, только один из них с флагом --dev .

Установка пакета так же проста. Все сводится к команде || pipenv install mypy || . Я покажу пример, в котором мы установим два пакета, только один из них с флагом || --dev || .

Чтобы понять, что произошло на самом деле, нам нужно знать, что такое файл Pip и для чего он предназначен. Popfile является такой лучшей альтернативой requirements.txt . При использовании pip очень часто у нас возникают проблемы с процессом разработки. Обычно это делается путем хранения нескольких файлов в качестве requirements_dev.txt или requirements_tests.txt в проекте. Это не идеальное решение.

Файл Pip решает эти проблемы с помощью своей структуры. На самом деле есть два файла – popfile и pip-файл.замок . В первом из них наши пакеты разделены на два раздела, в которых мы можем хранить пакеты, необходимые для версии для производства и разработки. Установив requests с флагом --dev , мы просто добавим этот пакет в этот раздел. Второй-файл pip.lock – это набор хэшей, подтверждающих версии данного пакета. Давайте посмотрим на ваш файл pip файл:

Мерзавцы

Конечно, это очень простой файл, который можно расширить многими вещами. Синтаксис для определения интересующего нас пакета очень сложен (во всем это язык, который называется TOML ), однако можно очень точно определить, что вы хотите использовать в проекте. Давайте рассмотрим несколько более сложный пример:

Мерзавцы

Второй файл-это файл pip.замок . Это набор хэшей, которые подтверждают версии данного пакета. Обсуждение pip Я упомянул флаг --hash . Создание хэшей из файлов гарантирует, что файл является точно таким же файлом, который мы использовали при первоначальной установке библиотеки. В requirements.txt была возможность хранить информацию о пароле, но это было очень непрактично, так как читаемость такого файла была значительно снижена. Файл Pipe разбивает его на два файла, так что вещи, которые интересуют нас ежедневно (содержимое файла pipefile), очень удобочитаемы. Также стоит упомянуть команду graph . Он работает так же, как упоминалось в предыдущей записи pipdeptree . Более доступным способом он отображает пакеты, установленные в нашей среде, показывая зависимости между ними.

Чтобы иметь возможность запускать программу в заданной среде, мы можем сделать это двумя способами. Мы можем войти в заданную среду с помощью команды pipe shell . Это точно то же самое, что мы делали с помощью source с venv или virtualenv . Второе решение очень похоже на синтаксис инструмента Docker . С помощью pipenv run мы можем запустить что-то, что будет работать в контексте нашей среды.

Кроме того, команда check является очень интересной функциональностью, которая позволяет нам легко проверить правильность маркеров, определяющих зависимости пакетов, описанных в PEP 508 (т. Е. синтаксис, используемый в файле pipfile ), и, что еще более интересно, проверить, появились ли какие-либо исправления безопасности в одном из наших пакетов. Благодаря этому мы будем знать, когда мы должны поднять наш пакет до самой последней версии.

Piper nv – очень интересный фрагмент кода, и благодаря интеграции с несколькими другими решениями он идеально подходит в качестве основного инструмента в повседневной работе разработчика на python. Благодаря тому, что он частично поддерживает pyenv , нам не нужно беспокоиться о том, какой интерпретатор следует использовать. Кроме того, поддержка файла pip или функций, которые полностью охватывают приложение pip , делает его самым привлекательным инструментом управления пакетами в python на данный момент.

Этот пост был первоначально опубликован на http://snoozy.ninja/.