pip и PyPI

Материал из llmdocs — справочник разработчика
Портал: Python
pip и PyPI
pip — типустановщик пакетов
pip — появился2008
PyPI — запущен2003
СопровождениеPython Packaging Authority (PyPA), PSF
Форматы пакетовwheel (.whl), sdist (.tar.gz)
Входит в Pythonс 3.4 через ensurepip (PEP 453)
Лицензия pipMIT
Сайтыpip.pypa.io, pypi.org

pip — стандартный установщик пакетов для Python, а PyPI (Python Package Index) — центральный публичный каталог, в котором разработчики публикуют свои библиотеки и откуда pip их по умолчанию скачивает. Вместе они образуют основу экосистемы: команда pip install requests находит пакет на PyPI, выбирает подходящую версию и файл под текущую платформу, устанавливает его и все зависимости.

История

PyPI запущен в 2003 году; среди разработчиков он долго носил шутливое имя Cheese Shop по скетчу «Монти Пайтона». В 2018 году каталог переехал на новую платформу Warehouse, на которой работает pypi.org.

Первым массовым установщиком был easy_install из пакета setuptools. В 2008 году Ян Бикинг выпустил pip как его замену: с удалением пакетов, файлами требований и понятными ошибками. Начиная с Python 3.4 pip поставляется вместе с интерпретатором через модуль ensurepip (PEP 453).[2] В версии pip 20.3 (2020) появился полноценный резолвер зависимостей, который отказывается ставить несовместимые наборы версий, а не устанавливает их молча.[4]

Форматы пакетов

Формат Что это
wheel (.whl) готовый к установке архив, в том числе с уже скомпилированными расширениями под конкретную платформу (PEP 427)[3]
sdist (.tar.gz) исходный код; при установке pip собирает его, что может потребовать компилятора

В имени wheel-файла зашиты версия Python, ABI и платформа, например numpy-2.1.0-cp312-cp312-manylinux_2_17_x86_64.whl. pip выбирает наиболее подходящий wheel и обращается к sdist, только если подходящего нет.

Основные команды

python -m pip install requests              # установить последнюю версию
python -m pip install "django>=5,<6"        # с ограничением версии
python -m pip install -r requirements.txt   # из файла требований
python -m pip install -e .                  # проект в режиме разработки
python -m pip list --outdated               # устаревшие пакеты
python -m pip freeze > requirements.txt     # зафиксировать текущие версии
python -m pip uninstall requests

Вызов через python -m pip гарантирует, что пакет поставится именно для того интерпретатора, который вы запускаете. Ставить пакеты рекомендуется внутри виртуального окружения.

Файлы зависимостей

  • requirements.txt — простой список пакетов с версиями, по строке на пакет;
  • pyproject.toml — стандартное описание проекта и его зависимостей (PEP 621);
  • constraints-файлы (-c constraints.txt) ограничивают версии, не добавляя пакеты;
  • режим проверки хешей (--require-hashes) защищает от подмены файлов.

pip не создаёт файл блокировки (lockfile) с полным деревом зависимостей; эту задачу решают pip-tools, Poetry, PDM или uv.

Публикация на PyPI

Пакет собирается командой python -m build (появляются sdist и wheel) и загружается утилитой twine или средствами менеджера проекта. С 2023 года PyPI поддерживает доверенную публикацию (Trusted Publishing): конвейер CI, например GitHub Actions, получает кратковременный токен по OpenID Connect, и долгоживущие пароли API хранить не нужно.[5] С 1 января 2024 года двухфакторная аутентификация обязательна для всех, кто публикует пакеты.

Безопасность

Любой может опубликовать пакет на PyPI, поэтому существуют риски цепочки поставок:

  • тайпсквоттинг — пакеты с именами, похожими на популярные (reqeusts вместо requests), содержащие вредоносный код;
  • выполнение кода при установке — сборка sdist запускает произвольный код, поэтому предпочтительнее wheel;
  • подмена зависимостей — внутренний пакет компании перекрывается одноимённым публичным.

Меры: проверять имена пакетов, фиксировать версии и хеши, использовать частные индексы и зеркала (--index-url), сканировать зависимости на известные уязвимости.

Альтернативы

uv совместим с интерфейсом pip (uv pip install) и работает в разы быстрее; Poetry и PDM управляют зависимостями проекта целиком; conda использует собственные каналы пакетов. Аналоги в других языках — npm (см. npm), Cargo (см. Cargo и crates.io), Go-модули.

См. также

Источники

  1. pip documentation
  2. PEP 453 — Explicit bootstrapping of pip in Python installations
  3. PEP 427 — The Wheel Binary Package Format
  4. pip — Dependency Resolution
  5. PyPI Docs — Trusted Publishers
  6. Python Packaging User Guide