# pipx: изолированные Python-утилиты без боли

Индекс LLMS: [llms.txt](/llms.txt)

---

pipx решает простую, но хроническую проблему: когда нужно запустить Python-утилиту однажды или разово, а `pip install` засоряет глобальное окружение или требует виртуальное окружение, которое потом забываешь удалить. pipx создаёт изолированное venv для каждой утилиты, устанавливает туда зависимости и делает бинарник доступным в `$PATH`. Одна команда — и утилита работает, не конфликтуя ни с чем.

## Что такое pipx и зачем он нужен

pipx — это инструмент для установки и запуска Python-приложений в изолированных виртуальных окружениях. Каждая утилита живёт в своём venv под `~/.local/pipx/venvs/`, а её console-scripts симлинкуются в `~/.local/bin/`.

Проблемы, которые решает:

- Конфликт версий между проектами: `black==23` и `black==24` не могут сосуществовать в одном окружении, но в pipx — легко.
- Глобальный `pip install` засоряет системный Python и ломает `apt` на Debian-based системах.
- Забытые venv после разового использования.

> [!NOTE]
> pipx не заменяет `pip` внутри проектов. Он инструмент для CLI-утилит: `black`, `poetry`, `httpie`, `ansible`, `awscli`, `pre-commit` и т.д.

## Установка pipx

Наиболее надёжный способ — через `pip` в user-режиме или через пакет менеджер системы.

```bash
# Вариант 1: через pip (Python 3.6+)
python3 -m pip install --user pipx
python3 -m pipx ensurepath

# Вариант 2: через apt (Debian/Ubuntu, версия может быть старее)
sudo apt install pipx

# Вариант 3: через brew (macOS)
brew install pipx
```

После установки убедись, что `~/.local/bin` в `$PATH`:

```bash
echo $PATH | grep -q "$HOME/.local/bin" && echo "OK" || echo "add to PATH"
```

> [!WARNING]
> Если `ensurepath` не сработал, добавь вручную в `~/.bashrc` или `~/.zshrc`:
> `export PATH="$HOME/.local/bin:$PATH"`

## Базовые команды: install, run, list

Три команды покрывают 90% случаев использования.

```bash
# Установить утилиту глобально (создаёт venv, симлинки бинарник)
pipx install black

# Запустить утилиту без установки (download + run в временном venv)
pipx run httpie https://api.example.com/health

# Посмотреть все установленные утилиты
pipx list
```

Флаги, которые стоит запомнить:

| Флаг | Что делает | Пример |
|------|-----------|--------|
| `--spec` | Указать источник (PyPI, git, wheel) | `pipx install --spec git+https://github.com/user/repo.git tool` |
| `--suffix` | Добавить суффикс к бинарнику | `pipx install black --suffix==24` |
| `--python` | Указать интерпретатор | `pipx install --python python3.11 black` |
| `--system-site-packages` | Доступ к системным пакетам | `pipx install --system-site-packages tool` |
| `--force` | Переустановить поверх | `pipx install --force black` |

> [!TIP]
> `pipx run` — ключевая команда для разового использования. Она качает пакет, создаёт временное venv, выполняет и удаляет. Никакого следа.

## Управление зависимостями и переустановка

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

```bash
# Обновить одну утилиту
pipx upgrade black

# Обновить все установленные утилиты
pipx upgrade-all

# Удалить утилиту и её venv целиком
pipx uninstall black

# Удалить всё кроме самого pipx
pipx uninstall-all

# Посмотреть зависимости установленного пакета
pipx list --verbose
```

Если что-то сломалось — переустановка занимает секунды:

```bash
pipx reinstall black
# или с указанием интерпретатора
pipx reinstall --python python3.12 black
```

> [!WARNING]
> `pipx upgrade-all` может обновить инструмент до версии с обратными несовместимостями. В CI/CD лучше фиксировать версию: `pipx install black==24.8.1`.

## Типичные сценарии в DevOps

pipx вписывается в несколько рабочих паттернов, где не нужен полноценный проект с `requirements.txt`.

**1. Единоразовые утилиты в CI/CD.** Вместо установки в Docker-образ или глобально:

```bash
# В Dockerfile или entrypoint скрипте
pipx run --spec https://pypi.org/project/aws-nuke/ aws-nuke --force --account-id $AWS_ACCOUNT_ID
```

**2. Параллельные версии одного инструмента.** Полезно при миграции проектов:

```bash
pipx install black --suffix==23
pipx install black --suffix==24
black==23 --version
black==24 --version
```

**3. Локальный dev-окружение без привилегий.** Установка `ansible`, `terraform` (через pipx-совместимые обёртки), `pre-commit` без sudo и без влияния на системный Python.

**4. Проверка пакета перед интеграцией.** Быстро протестировать утилиту, не добавляя её в `requirements.txt`:

```bash
pipx run httpx https://example.com
# Если понравилось — установить навсегда
pipx install httpx
```

> [!TIP]
> В связке с `direnv` и `.envrc` можно прописывать `pipx run` для конкретных задач проекта — утилита доступна только в директории, а зависимости не вылезают в глобальное окружение.

pipx не пытается быть пакетным менеджером для всего Python. Он делает одну вещь — изолированную установку CLI-утилит — и делает это без лишнего шума. Для Lead DevOps это значит: меньше времени на борьбу с конфликтами зависимостей, больше на архитектуру.
