Современный Python: начинаем проект с pyenv и poetry

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

Однако, когда вам нужно перейти к этому шагу, есть аспект, который вы, возможно, недооцениваете, а именно: как создать правильную среду. Среду, которая внедряет хорошие методы разработки программного обеспечения, повышает производительность и облегчает сотрудничество. В Adaltas мы управляем несколькими проектами с открытым исходным кодом и приветствуем большой вклад. В основном они нацелены на платформу Node.js. На основе этого опыта мы уже создали общие практики для управления крупномасштабными проектами, написанными на Node.js.

Еще один язык, который мы также часто используем в нашей повседневной работе в качестве консультанта по данным, - это Python. Упаковка и инструментарий для Python часто описываются как громоздкие и сложные. В связи с этим в последние годы появилось несколько проектов с открытым исходным кодом, цель которых - облегчить управление пакетами Python в рамках ваших рабочих проектов. Здесь мы рассмотрим, как использовать два из них: Pyenv, для управления и установки различных версий Python, и Poetry, для управления пакетами и виртуальными окружениями. Объединенные вместе или используемые по отдельности, они помогут вам создать продуктивную среду.

Пререквизиты

pyenv установка

Для установки pyenv вам потребуются некоторые зависимости, специфичные для данной ОС. Они необходимы, поскольку pyenv устанавливает Python путем сборки из исходных текстов. Для Ubuntu/Debian обязательно должны быть установлены следующие пакеты:

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

Чтобы узнать необходимые зависимости для вашей ОС, прочитайте эту документацию. После установки зависимостей вы можете установить pyenv. Для этого я рекомендую использовать pyenv-installer, который автоматизирует процесс.

curl https://pyenv.run | bash

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

pyenv install --list

В нашем случае мы собираемся установить классический CPython в версиях 3.7.10 , 3.8.7 , 3.9.2:

pyenv install 3.7.10
Downloading Python-3.7.10.tar.xz...
-> https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tar.xz
Installing Python-3.7.10...
Installed Python-3.7.10 to /home/fbraza/.pyenv/versions/3.7.10

После установки версий вы можете увидеть их, выполнив:

pyenv versions
* system
  3.7.10
  3.8.7
  3.9.2

Вы видите, что pyenv определил недавно установленные версии Python, а также версию, установленную по умолчанию в вашей системе. * перед system означает, что глобальная версия, используемая сейчас, является системной. pyenv позволяет управлять версиями Python на разных уровнях: глобально и локально. Допустим, мы собираемся установить версию 3.7.10 в качестве глобальной версии.

pyenv global 3.7.10

Давайте еще раз перечислим нашу версию:

pyenv versions
  system
* 3.7.10 (set by /home/<username>/.pyenv/version)
  3.8.7
  3.9.2

Вы видите, что pyenv устанавливает 3.7.10 в качестве нашей глобальной версии Python. Это не изменит операции, которые требуют использования системной версии. Путь, который вы можете прочитать между скобками, соответствует пути, указывающему на требуемую версию Python. Как это работает? Вкратце, pyenv перехватывает команды Python с помощью исполняемых файлов, внедренных в ваш PATH. Затем он определяет, какую версию Python вам нужно использовать, и передает команды в нужную установку Python. Не стесняйтесь прочитать полную документацию, чтобы лучше понять функциональность и возможности, предлагаемые pyenv.

Не путайтесь в семантике. Изменение глобальной версии не повлияет на вашу системную версию. Системная версия соответствует версии, используемой вашей ОС для выполнения определенных задач или запуска фоновых процессов, которые зависят от данной конкретной версии Python. Не меняйте системную версию на другую, иначе вы можете столкнуться с рядом проблем с вашей ОС! Эта версия обычно обновляется вместе с вашей ОС. Глобальная версия - это просто версия, которую pyenv будет использовать для глобального выполнения ваших команд/программ Python.

poetry установка

Poetry позволяет эффективно управлять зависимостями и пакетами в Python. Он выполняет ту же роль, что и setup.py или pipenv, но обладает большей гибкостью и функциональностью. Вы можете объявить библиотеки, от которых зависит ваш проект, в файле pyproject.toml. После этого poetry будет устанавливать или обновлять их по требованию. Кроме того, этот инструмент позволяет инкапсулировать рабочий проект в изолированное окружение. Наконец, вы можете использовать poetry для прямой публикации вашего пакета на Pypi.

В качестве последнего предварительного условия мы установим poetry, выполнив следующую команду:

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

Создание проекта

Мы рассмотрим, как создать проект и изолировать его внутри среды Python с помощью pyenv и poetry.

Установка версии Python с помощью Pyenv

Сначала создадим каталог с именем my_awesome_project и переместимся в него:

mkdir my_awesome_project && cd $_

Внутри установите локальную версию Python, которую мы будем использовать (мы будем использовать Python 3.8.7). Это подскажет poetry использовать локальную версию Python, определенную pyenv:

pyenv local 3.8.7

Это создает файл .python-version внутри нашего проекта. Этот файл будет прочитан pyenv и предложит ему установить определенную локальную версию Python. Следовательно, каждый каталог или файл, созданный после этого момента, будет зависеть от локальной версии Python, а не от глобальной.

Создайте свой проект с помощью poetry

Poetry предлагает надежный CLI, позволяющий создавать, настраивать и обновлять ваш проект Python и зависимости. Для создания проекта Python используйте следующую команду:

poetry new <project_name>

Эта команда генерирует проект по умолчанию. Содержание нашего нового проекта следующее:

.
├── 
│   └── __init__.py
├── pyproject.toml
├── README.rst
└── tests
    ├── __init__.py
    └── test_summarize_dataframe.py

Обратите внимание на pyproject.toml. Здесь мы определяем все метаданные нашего проекта, зависимости, скрипты и многое другое. Если вы знакомы с Node.js, считайте pyproject.toml эквивалентом Node.js package.json.

[tool.poetry]
name = "your_project_name"
version = "0.1.0"
description = ""
authors = ["<username> <email address>"]

[tool.poetry.dependencies]
python = "^3.8"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Мы видим несколько записей в нашем стандартномpyproject.toml файле.

  • [tool.poetry]: Этот раздел содержит метаданные о нашем пакете. Вы можете поместить сюда название пакета, краткое описание, данные об авторе, версию вашего проекта и так далее. Все детали здесь необязательны, но будут необходимы, если вы решите опубликовать пакет на Pypi.
  • [tool.poetry.dependencies]: Этот раздел содержит все необходимые зависимости для нашего пакета. Вы можете указать конкретные номера версий этих пакетов (packageX = "1.0.0") или использовать символы. Здесь также задается версия Python, которую мы хотим использовать в проекте. В нашем случае python = "^3.8" указывает минимальную версию, необходимую для работы нашего приложения. Здесь это Python 3.8, и он был основан на версии нашей локальной версии, определенной с помощью pyenv.
  • [tool.poetry.dev-dependencies]: Этот раздел содержит все зависимости разработчика, которые являются пакетами, необходимыми для работы и итераций над этим проектом. Тем не менее, эти зависимости не требуются для запуска приложения и не будут загружены при сборке пакета.
  • [build-system]: Не трогайте этот раздел, если вы не обновили версию poetry.

вы можете посмотреть полный список доступных записей для файла pyproject.toml здесь

Установите и активируйте виртуальную среду

Здесь есть два подхода: либо вы заранее знаете все необходимые вам зависимости и можете напрямую изменить файл .toml соответствующим образом, либо вы решаете добавить их позже, когда это необходимо. В нашем примере мы собираемся постепенно добавлять зависимости в процессе написания кода. Следовательно, нам нужно только инициализировать проект и создать виртуальную среду. Для этого выполните команду:

poetry install
Creating virtualenv summarize-dataframe-SO-g_7pj-py3.8 in ~/.cache/pypoetry/virtualenvs
Updating dependencies
Resolving dependencies... (6.4s)

Writing lock file

Package operations: 8 installs, 0 updates, 0 removals

  • Installing pyparsing (2.4.7)
  • Installing attrs (20.3.0)
  • Installing more-itertools (8.7.0)
  • Installing packaging (20.9)
  • Installing pluggy (0.13.1)
  • Installing py (1.10.0)
  • Installing wcwidth (0.2.5)
  • Installing pytest (5.4.3)

Installing the current project: summarize_dataframe (0.1.0)

Сначала создается виртуальная среда и хранится вне проекта. Это немного похоже на то, что мы имеем при использовании conda. Действительно, вместо создания папки, содержащей ваши библиотеки зависимостей (как это делает virtualenv), poetry создает окружение по глобальному системному пути (.cache/ по умолчанию). Такое разделение задач позволяет держать ваш проект вдали от исходного кода зависимостей.

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

Во-вторых, poetry собирается прочитать pyproject.toml и установить все зависимости, указанные в этом файле. Если они не определены, то будет загружена последняя версия пакетов. В конце операции создается файл poetry.lock. Он содержит все пакеты и их точные версии. Помните, что если файл poetry.lock уже существует, то номера версий, определенные в нем, имеют приоритет над теми, что определены в pyproject.toml. Наконец, вы должны зафиксировать файл poetry.lock в репозитории вашего проекта, чтобы все участники, работающие над проектом, использовали одинаковые версии зависимостей.

Теперь активируем только что созданную среду следующей командой:

peotry shell
Spawning shell within ~/.cache/pypoetry/virtualenvs/summarize-dataframe-SO-g_7pj-py3.8
. ~/.cache/pypoetry/virtualenvs/summarize-dataframe-SO-g_7pj-py3.8/bin/activate

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

Создайте наш git репозиторий

Для нашего последнего шага здесь мы собираемся создать git-репозиторий, добавить README.md и .gitignore файлы и переместить все в наш удаленный репозиторий .

git init
git remote add origin https://github.com/fbraza/summarize_dataframe.git
echo ".*\n!.gitignore" > .gitignore
echo "# Summarize dataframe" > README.md
git add .
git commit -m "build: first commit. Environment built"
git push -u origin master

Заключение

Здесь мы рассмотрели, как устанавливать и управлять различными версиями Python на нашей машине с помощью pyenv. Мы продемонстрировали, как использовать pyenv local для установки определенной версии Python в вашем проекте, а затем создать виртуальную среду с помощью poetry. Использование poetry действительно сглаживает процесс создания, предлагая простой и широко распространенный эшафот проекта. Кроме того, он включает минимальные требования к системе сборки, как определено PEP 518.

В нашей следующей статье мы более глубоко погрузимся в наш проект. Мы напишем несколько кодов с соответствующими модульными тестами и посмотрим, как мы можем использовать poetry для добавления ожидаемых зависимостей и запуска тестов. Наконец, мы пойдем немного дальше и установим все необходимые зависимости с помощью poetry, чтобы помочь нам внедрить хорошую практику с нашими git коммитами при использовании проекта Python.

Шпаргалка

pyenv

  • Получите все доступные и устанавливаемые версии Python

      pyenv install --list
  • Установите глобальную версию Python

     pyenv global <version_id>
  • Установите локальную версию Python

      pyenv local <version_id>

poetry

  • Создайте проект

      poetry new <project_name>
  • Установите основные зависимости и создайте окружение

      poetry install
  • Активируйте окружение

      poetry shell
Вернуться на верх