pip и PyPI
| pip — тип | установщик пакетов |
|---|---|
| pip — появился | 2008 |
| PyPI — запущен | 2003 |
| Сопровождение | Python Packaging Authority (PyPA), PSF |
| Форматы пакетов | wheel (.whl), sdist (.tar.gz) |
| Входит в Python | с 3.4 через ensurepip (PEP 453) |
| Лицензия pip | MIT |
| Сайты | 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-модули.