Перейти к содержимому

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

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 после разового использования.
Примечание

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

Установка pipx

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

# Вариант 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:

echo $PATH | grep -q "$HOME/.local/bin" && echo "OK" || echo "add to PATH"
Предупреждение

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

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

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

# Установить утилиту глобально (создаёт 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
Подсказка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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:

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

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

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