# Глава 38. Инфраструктура. Популярные сторонние библиотеки
Кратко коснемся всего, что сопутствует написанию кода на питоне: вариантам установки языка на целевую систему, изоляции окружения, управлению зависимостями. Перечислим наиболее популярные сторонние модули.
Некоторые темы главы немного выходят за рамки курса. А для раскрытия некоторых напрашивается отдельный самостоятельный курс. Поэтому цель главы — не в том, чтобы глубоко раскрыть все аспекты инфраструктуры и библиотек вокруг языка, а в том, чтобы подсказать дальнейшие шаги для расширения кругозора. Так сказать, просто накидать ключевых слов.
## Установка и апгрейд питона
Есть 5 наиболее распространенных способов инсталляции и обновления версии питона.
- Официальный сайт [python.org.](https://www.python.org/downloads/) Здесь можно выбрать версию языка, целевую платформу и скачать дистрибутив: tarball для Linux, инсталляторы для macOS и Windows.
- Репозитории ОС. Питон устанавливается с помощью менеджера пакетов, например [apt-get,](https://help.ubuntu.ru/wiki/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE_ubuntu_server/%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0%D0%BC%D0%B8/apt-get) [yum,](https://ru.wikipedia.org/wiki/Yum) [homebrew](https://brew.sh/) и т.д.
- [Docker](https://www.docker.com/) образы. Можно выбрать нужную версию языка, скачать образ с [hub.docker.com](https://hub.docker.com/_/python) и запустить в контейнере.
- [Anaconda:](https://www.anaconda.com) дистрибутив питона в связке со свободными библиотеками для анализа данных и машинного обучения. Включает в себя менеджер управления зависимостями `conda`.
- [pyenv](https://github.com/pyenv/pyenv) — инструмент для установки и переключения версий питона. Позволяет держать на целевой машине множество версий языка и переключаться между ними.
Рассмотрим несколько команд `pyenv` для понимания, насколько просто с его помощью жонглировать версиями питона.
Просмотр версий, доступных для установки:
```shell
pyenv install --list
```
```
Available versions:
2.1.3
...
3.12.0
...
anaconda3-5.3.1
ironpython-2.7.7
jython-2.7.2
micropython-1.18
pypy3.9-7.3.9
...
```
Мы показали далеко не весь вывод команды. Он демонстрирует, что для установки через `pyenv` доступны версии питона в реализации [CPython](https://github.com/python/cpython) (начиная с 2.1 и заканчивая самой свежей), а также [anaconda,](https://www.anaconda.com/) [micropython](https://micropython.org/) (дистрибутив для микроконтроллеров), [pypy](https://www.pypy.org/) (в нем реализован JIT-компилятор, который конвертирует питон-код в машинный код в рантайме) и другие сборки языка.
Из списка доступных версий можно выбрать и установить любую:
```shell
pyenv install 3.12.0
```
Просмотр версий, установленных в системе:
```shell
pyenv versions
```
```
system
3.7.3
* 3.12.0 (set by /home/senjun/examples/.python-version)
```
Вывод показывает, что на целевой машине стоит системная версия питона, а также 3.7.3 и 3.12.0 для проекта `examples`.
С помощью команд `pyenv global <version>`, `pyenv local <version>` и `pyenv shell <version>` задается глобальная для всей системы версия питона, версия для текущей директории и соответственно для текущей сессии в терминале.
```shell
python3 --version
pyenv local 3.12.0
python3 --version
```
```
Python 3.7.5
Python 3.12.0
```
Видно, что после выполнения `pyenv local` подхватывается интерпретатор нужной версии.
## Изоляция окружения
Для локальной разработки или разворачивания проекта на проде необходимо создать виртуальное окружение. **Виртуальное окружение** (virtual environment) — это средство изоляции зависимостей проекта на питоне от глобального окружения и предотвращения возможных конфликтов библиотек.
С его помощью на одном и том же сервере могут быть подняты два сервиса, один из которых использует библиотеку pandas актуальной версии 2.1.2, а другой — старенькую pandas 1.5.2.
Настройка виртуального окружения заключается в:
- его создании (заведении специальной директории, содержащий все необходимые файлы окружения),
- активации окружения для начала работы с проектом,
- деактивации, если требуется в рамках одной сессии терминала переключиться на другой проект.
Все это в мире питона можно организовать с помощью множества опенсорсных инструментов. И вот самые популярные из них:
- [venv.](https://docs.python.org/3/library/venv.html) Стандартный модуль питона для работы с окружением. Вызывается из консоли. Для управления зависимостями в связке с `venv` зачастую используется стандартный менеджер пакетов [pip.](https://pypi.org/project/pip/)
- [virtualenv.](https://virtualenv.pypa.io/en/latest/index.html) Более продвинутый инструмент, чем `venv`. Варианты установки `virtualenv` приведены на [официальном сайте.](https://virtualenv.pypa.io/en/latest/installation.html) Также используется в связке с менеджером пакетов.
- [Conda.](https://docs.conda.io/en/latest/) Менеджер пакетов и виртуального окружения, пришедший из проекта [Anaconda.](https://www.anaconda.com) Поэтому чаще всего используется в проектах для анализа данных и машинного обучения.
- [pipenv.](https://pipenv.pypa.io/en/latest/) Менеджер зависимостей и виртуального окружения.
- [Poetry.](https://python-poetry.org/) Инструмент, схожий по функциональности с pipenv. Заодно позволяет пакетировать и публиковать приложения.
Так как venv — стандартный модуль питона, рассмотрим именно его. Примеры команд в этой главе ориентированы на Linux и macOS, и некоторые из них могут не подойти пользователям Windows.
Команда для создания виртуального окружения:
```shell
python3 -m venv <venv_directory_name>
```
Путь к директории с виртуальным окружением `venv_directory_name` чаще всего именуется `.venv` (скрытая директория) или `venv`. Ее не нужно сохранять в системе контроля версий.
Допустим, мы создали виртуальное окружение в директории `.venv`. Тогда его активация будет выглядеть следующим образом:
```shell
source .venv/bin/activate
```
После выполнения этой команды можно устанавливать все необходимые зависимости проекта и запускать его.
Деактивация окружения выполняется просто:
```shell
deactivate
```
## Управление зависимостями
Некоторые из инструментов для работы с виртуальным окружением также умеют управлять зависимостями. А вообще в языке есть официальный инсталлятор пакетов [pip.](https://pypi.org/project/pip/) С его помощью можно скачивать пакеты из [официального репозитория](https://packaging.python.org/en/latest/glossary/#term-Python-Package-Index-PyPI) PyPI (Python Package Index).
Пакеты для скачивания из PyPI доступны в двух вариантах:
- [Wheels:](https://packaging.python.org/en/latest/glossary/#term-Wheel) стандартный формат распространения. Используется pip по умолчанию. Wheel — это заранее подготовленный пакет, который максимально быстро устанавливается на целевую платформу.
- [Sdist](https://packaging.python.org/en/latest/glossary/#term-Source-Distribution-or-sdist) (source distributions). Формат распространения метаданных и исходников, которые необходимо подготавливать после скачивания на целевую платформу.
Установка через pip библиотеки pandas:
```shell
pip3 install pandas
```
Установка конкретной версии:
```shell
pip3 install pandas==2.1.2
```
Просмотр всех установленных пакетов:
```shell
pip3 freeze
```
Сохранение списка установленных пакетов в файл requirements.txt:
```shell
pip3 freeze > requirements.txt
```
В requirements.txt попадут абсолютно все установленные в проекте пакеты вместе с версиями:
```
asgiref==3.6.0
certifi==2022.12.7
charset-normalizer==3.0.1
...
```
Именем requirements.txt [принято](https://pip.pypa.io/en/stable/user_guide/#requirements-files) называть файл, в котором перечислены зависимости проекта. Установка из него всех необходимых пакетов:
```shell
pip3 install -r requirements.txt
```
Фиксирование зависимостей и их установка через pip по-прежнему широко распространены. Но прибегать к ним не рекомендуется по ряду причин. И вот некоторые из них:
- Накапливание в requirements.txt транзитивных зависимостей. То есть таких, которые подключаются неявно через прямые зависимости проекта.
- В requirements.txt могут попасть лишние пакеты, с которыми программист экспериментировал в процессе работы над проектом.
- Риск ошибок при установке зависимостей в другом окружении.
В некоторых случаях вместо единого requirements.txt удобнее держать отдельные файлы для prod, dev и test окружений. Вы можете познакомиться с разными подходами хранения зависимостей в таких проектах как [OpenStack,](https://github.com/openstack/nova) [Ansible,](https://github.com/ansible/ansible) [HTTPX.](https://github.com/encode/httpx)
Хоть pip и является официальным инсталлятором пакетов для питона, но это всего лишь инсталлятор. Поэтому зачастую имеет смысл посмотреть в сторону полноценных инструментов для управления проектом. Например, [Poetry](https://python-poetry.org/) умеет не только управлять зависимостями и виртуальным окружением, но и пакетировать проект и публиковать его. Poetry используют такие проекты как [watchdog,](https://github.com/gorakhargosh/watchdog) [scrapy,](https://github.com/secdev/scapy) [celery.](https://github.com/celery/celery)
## Сторонние библиотеки и фреймворки
Питон славится тем, что многое в нем доступно «из коробки»: стандартная библиотека содержит огромное количество модулей на все случаи жизни. На практике почти всегда используются third party пакеты для быстрого создания веб-приложений, удобной работы с бд через ORM, для анализа данных и машинного обучения...
Перечислим по категориям самые распространенные сторонние библиотеки и фреймворки.
### Линтеры, статические анализаторы, форматтеры
При разработке крупных проектов на питоне не обойтись без статических анализаторов кода, линтеров и форматтеров.
[mypy](https://mypy.readthedocs.io/en/stable/) — статический анализатор кода. Мы обсуждали его в главе про [аннотации типов.](/courses/python/chapters/python_chapter_0330/)
[Ruff](https://github.com/astral-sh/ruff) — быстрый линтер и форматтер кода, написанный на [Rust.](/courses/rust/)
[Flake8](https://flake8.pycqa.org/en/latest/) — линтер, который сканирует код на наличие ошибок, проблем со стилем и цикломатической сложностью.
[Pylint](https://pypi.org/project/pylint/) — линтер и статический анализатор кода.
[Black](https://github.com/psf/black) — форматтер кода для приведения проекта в соответствие с [PEP8.](https://peps.python.org/pep-0008/)
### Юнит тесты
В питоне есть [стандартный модуль](https://docs.python.org/3/library/unittest.html) `unittest` для покрытия кода юнит-тестами. Но если вам не хватает его функциональности, посмотрите в сторону фреймворка [pytest.](https://docs.pytest.org/en/7.4.x/)
### Веб-фреймворки
[Flask](https://flask.palletsprojects.com/en/3.0.x/) — легковесный веб-фреймворк с минималистичным синтаксисом. Flask так или иначе используют такие площадки как Pinterest, Patreon, Netflix, Uber.
[Django](https://www.djangoproject.com/) — чрезвычайно богатый на возможности мощный веб-фреймворк. Django используют площадки: Instagram, YouTube, BitBucket, Reddit.
[FastAPI](https://fastapi.tiangolo.com/) — высокопроизводительный простой веб-фреймворк для быстрого создания API. Его используют такие компании как Uber, Netflix, Microsoft.
### Анализ данных
[NumPy](https://numpy.org/) — библиотека, в которой эффективно реализованы многомерные массивы и математические операции над ними. Название является сокращением от «Numerical Python». NumPy по праву считается опенсорсной альтернативой MATLAB.
На базе NumPy строится другая распространенная библиотека — Pandas.
[Pandas](https://pandas.pydata.org/) — библиотека для обработки и анализа табличных данных и временных рядов: фильтрации, сортировки, модификации... Откуда такое название? Оно обыгрывает термин из эконометрики и социальных наук «panel data». Панельные данные — это многомерные данные, структурированные в таблицы и полученные в ходе каких-то измерений.
В pandas реализованы 2 знаменитых класса:
- `Series` — одномерный массив.
- `DataFrame` — двумерный массив, в котором столбцы — это объекты `Series`.
С этими классами умеет работать большинство библиотек для анализа данных и машинного обучения: SciPy, Scikit-Learn и другие.
[SciPy](https://scipy.org/) — библиотека для научных и инженерных расчетов. С ее помощью легко решаются такие задачи как поиск экстремумов функций, вычисление интегралов, решение дифференциальных уравнений, обработка изображений и т.д.
### Визуализация данных
[Matplotlib](https://matplotlib.org/) — библиотека для построения любых видов графиков и статической, анимированной и интерактивной визуализации данных. С помощью Matplotlib легко визуализировать данные, полученные с помощью NumPy, Pandas, SciPy и других библиотек.
[Seaborn](https://seaborn.pydata.org/) — библиотека для визуализации данных, базирующаяся на Matplotlib. Предоставляет простой высокоуровневый интерфейс для построения графиков по статистическим данным.
### Машинное обучение
[Keras](https://keras.io/) — библиотека для глубокого обучения (deep learning), которая хорошо подходит новичкам в мире ML. Keras скорее предоставляет простой интерфейс, чем полноценный фреймворк для машинного обучения. Ее можно использовать в качестве надстройки для работы с TensorFlow, Theano, Microsoft Cognitive Toolkit и другими библиотеками.
[TensorFlow](https://www.tensorflow.org/) — фреймворк для машинного обучения от команды Google Brain. Позволяет создавать нейросети любой сложности и задействовать алгоритмы глубокого обучения. TensorFlow зачастую применяют для автоматизированной аннотации изображений, решения задач классификации и поиска объектов на изображениях.
Под капотом TensorFlow реализован на C++. Помимо пакета на питоне существуют реализации TensorFlow и для других языков: R, Go, Swift и т.д.
Название библиотеки TensorFlow намекает на ее природу: работа TensorFlow строится на операциях над тензорами (многомерными матрицами).
[Scikit-learn](https://scikit-learn.org) — библиотека для машинного обучения, базирующаяся на NumPy, SciPy, и Matplotlib. Предназначена для решения таких задач как препроцессинг данных (извлечение признаков, нормализация, понижение размерности), выбор и настройка модели, классификация, кластеризация, регрессия.
[PyTorch](https://pytorch.org/) — фреймворк для работы с моделями машинного обучения, в том числе для компьютерного зрения и обработки естественного языка.
[NLTK](https://www.nltk.org/) — библиотека для обработки текстов на естественном языке (Natural Language Toolkit). Анализ эмоциональной окраски сообщения, поиск именованных сущностей, реализация чат-бота, фильтрация спама — эти и многие другие задачи из области [NLP](https://en.wikipedia.org/wiki/Natural_language_processing) решаются с помощью NLTK.
### Компьютерное зрение
[OpenCV](https://opencv.org/) — библиотека, в которой реализовано множество алгоритмов компьютерного зрения, обработки изображений и видео.
## Резюмируем
- Перед началом работы с проектом на питоне крайне рекомендуется настроить виртуальное окружение.
- Стандартные инструменты для работы с виртуальным окружением и управления пакетами — это venv и pip. Но есть и более гибкие инструменты, такие как pipenv, Poetry.
- Сторонние пакеты питона поставляются в двух форматах: wheels и sdist.
- PyPI (Python Package Index) — официальный репозиторий, через который распространяются пакеты для питона.
Наша группа в telegram. Здесь можно задавать вопросы и общаться.
Задонатить. Если вам нравится курс, вы можете поддержать развитие площадки!