Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Пакеты и индексы Python: Настройка окружения

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

Как работают пакеты

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

Python-пакет содержит исходный код и метаданные — дополнительную информацию о пакете, в том числе:

  • Предназначение пакета
  • Текущую версию пакета и список предыдущих версий
  • Совместимость с разными версиями Python
  • Лицензию, под которой распространяется пакет
  • Список зависимостей пакета

Индекс

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

Усложним задачу и представим, что наш пакет требует каких-то других пакетов для своей работы. Вот тут-то и начнутся сложности — нужно будет приложить к нашему пакету дополнительные пакеты, которые могут потребовать еще больше пакетов. И этот цикл может продолжаться бесконечно.

Чтобы справиться с этой сложностью, воспользуемся репозиториями пакетов — в Python их принято называть индексами.

Такие индексы содержат пакеты. А еще они предоставляют пользователю удобный интерфейс для поиска пакетов и знакомства с их описанием. Обычно он сделан в виде web-сайта.

Самый популярный индекс пакетов — это PyPI или Python Package Index. Чаще всего вы будете работать именно с ним.

Но есть и другие индексы. Большинство инструментов работы с пакетами могут работать с разными индексами. К примеру, отдельные индексы используются многими компаниями для размещения пакетов, которые не являются открытыми (open source).

Еще один полезный индекс — Test PyPI. Это специальный индекс пакетов, который принято использовать для обучения работе с системой пакетирования Python.

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

Тестовый индекс работает точно так же, как основной PyPI. Он позволяет выкладывать и скачивать пакеты, но периодически удаляет все данные.

Индексы vs GitHub, BitBucket и прочие хранилища кода

В наши дни некоторые репозитории пакетов не хранят пакеты своими силами, а берут на себя только индексацию и управление метаданными пакетов. При этом код предлагается хранить на GitHub, BitBucket, GitLab, другими словами — в хранилищах исходного кода.

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

Но хранение кода на сторонних ресурсах по отношению к источнику метаданных обладает рядом недостатков.

Во-первых, опубликованным кодом владеет только автор кода. Автор может удалить свой репозиторий, а информация о пакете в индексе сохранится. Те, кто уже начал использовать пакет, столкнутся с невозможностью сборки своих проектов.

Во-вторых, GitHub и другие хранилища Git-репозиториев не гарантирует неизменность данных в репозитории при использовании одних только тегов и веток. А ведь именно такой способ привязки состояния кода к информации в индексе и используется чаще всего — то есть любой обладатель доступа к репозиторию может переписать его историю. Даже если привязывать версии пакетов в индексе к hash-суммам коммитов в Git, то изменение в истории приведет к первой проблеме — версия пакета будет ссылаться на несуществующий источник кода. При переписывании истории hash-суммы коммитов тоже поменяются.

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

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


Дополнительные материалы

  1. PyPI
  2. Test PyPI

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 25 апреля
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 25 апреля

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»