Главная / Курсы / Python / Инфраструктура. Популярные сторонние библиотеки
# Глава 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. Здесь можно задавать вопросы и общаться.
Задонатить. Если вам нравится курс, вы можете поддержать развитие площадки!