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

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

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

Опять пакеты

В рамках курса по основам Python уже упоминались пакеты (packages). Тогда пакеты описывались, как наборы модулей и вложенных пакетов. Но это не единственное значение слова "пакет" в Python-мире.

В более широком смысле пакет — это некая единица обмена кодом между разработчиками. Python-пакет содержит и исходный код (как раз в виде пакета в узком смысле, поэтому и название общее), и так называемые метаданные — дополнительную информацию о пакете. Метаданные описывают

  • предназначение пакета
  • версию пакета
  • совместимость с разными версиями Python
  • лицензию (software license), под которой распространяется пакет
  • список и версии зависимостей пакета (об этом поговорим позже)

и многое другое.

Индекс

Предположим, что мы имеем готовый пакет (а мы в итоге обязательно научимся их создавать), но как им поделиться с миром? Как правило, собранный пакет представляет собой обычный файл и в принципе его можно просто передать другому человеку — это даже сработает! А если вдруг окажется, что наш пакет требует каких-то других пакетов для своей работы? Вот тут-то и начнутся сложности — нужно будет приложить к нашему пакету дополнительные пакеты, которые могут потребовать ещё больше пакетов и т.д. и т.п.

Для упрощения жизни как авторов пакетов, так и пользователей, существуют так называемые репозитории пакетов. Только в Python их принято называть индексами. Помимо предоставления пакетов, индексы также могут обладать интерфейсом для поиска пакетов, знакомства с их описанием — проще говоря, предоставляют интерфейс пользователя (обычно в виде web-сайта).

Самый популярный индекс пакетов — это PyPI, Python Package Index. Чаще всего вы будете работать именно с ним. Но есть и другие индексы и большинство инструментов работы с пакетами могут работать с разными индексами. Отдельные индексы, к примеру, используются многими компаниями для размещения пакетов, которые не являются открытыми (open source).

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

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

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

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

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

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

Обе озвученные причины приводят к тому, что ломается важное свойство системы пакетирования — воспроизводимость сборки. Воспроизводимость здесь означает, что любой проект, содержащий точное описание своих зависимостей, "соберётся" (в случае Python — запустится) в любой момент времени, даже если проект использует очень старые версии пакетов и интерпретатора!

Централизованный индекс, самостоятельно хранящий все версии всех пакетов в неизменяемом виде, даёт значительно больше гарантий, что мы сможем собрать наш старый проект, когда бы мы этого ни захотели.


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

  1. PyPI
  2. Test PyPI

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

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

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
1 декабря 8 месяцев

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

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

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

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»