# pip и PyPI

> pip — стандартный установщик пакетов Python, PyPI — центральный публичный каталог пакетов, откуда pip их скачивает.

Источник: https://llmdocs.ru/wiki/pip-pypi/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **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](https://pip.pypa.io/), [pypi.org](https://pypi.org/)
**pip** — стандартный установщик пакетов для [Python](https://llmdocs.ru/wiki/python.md), а **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, только если подходящего нет.

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

```bash
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` гарантирует, что пакет поставится именно для того интерпретатора, который вы запускаете. Ставить пакеты рекомендуется внутри [виртуального окружения](https://llmdocs.ru/wiki/venv.md).

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

- `requirements.txt` — простой список пакетов с версиями, по строке на пакет;
- [pyproject.toml](https://llmdocs.ru/wiki/pyproject-toml.md) — стандартное описание проекта и его зависимостей (PEP 621);
- **constraints**-файлы (`-c constraints.txt`) ограничивают версии, не добавляя пакеты;
- режим проверки хешей (`--require-hashes`) защищает от подмены файлов.

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

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

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

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

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

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

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

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

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

## См. также

- [Виртуальные окружения (venv)](https://llmdocs.ru/wiki/venv.md)
- [pyproject.toml](https://llmdocs.ru/wiki/pyproject-toml.md)
- [uv (менеджер пакетов)](https://llmdocs.ru/wiki/uv.md)
- [Семантическое версионирование](https://llmdocs.ru/wiki/semver.md)

## Источники

1. [pip documentation](https://pip.pypa.io/en/stable/)
2. [PEP 453 — Explicit bootstrapping of pip in Python installations](https://peps.python.org/pep-0453/)
3. [PEP 427 — The Wheel Binary Package Format](https://peps.python.org/pep-0427/)
4. [pip — Dependency Resolution](https://pip.pypa.io/en/stable/topics/dependency-resolution/)
5. [PyPI Docs — Trusted Publishers](https://docs.pypi.org/trusted-publishers/)
6. [Python Packaging User Guide](https://packaging.python.org/)
