Pip vs pipx vs uv — which installer should you use?
Spec Kitty supports installing the CLI with three Python tools: pip, pipx, and uv tool. They are not interchangeable. This page explains the difference and recommends the right choice for your situation.
The short answer
| You are… | Use |
|---|---|
An end user who wants spec-kitty on your PATH |
pipx (or uv tool) |
A team standardizing on uv |
uv tool |
A contributor working inside a clone of spec-kitty |
pip in a venv |
| Anyone else | pipx |
Overview of each tool
pip
pip is the standard Python package installer. It installs into whatever Python environment you tell it to — system Python, a venv, conda, etc. It does not create isolation for you; it installs alongside everything else in that environment.
Use cases:
- Installing dependencies into an explicit virtual environment you manage.
- CI/CD images with a dedicated Python.
- Contributing to a Python project that you have cloned.
pipx
pipx is built on top of pip and venv. It installs each Python application (anything that exposes console scripts) into its own dedicated venv, then symlinks the script onto your PATH. You get isolation per-tool without managing venvs yourself.
Use cases:
- Installing CLI applications globally, with isolation.
- Running occasional one-shot tools with
pipx run. - Any modern Linux distro with PEP 668
externally-managed-environmentrules.
uv tool
uv is a fast, Rust-based Python toolchain. Its uv tool subcommand is conceptually similar to pipx — install applications into isolated venvs, expose their scripts — but it uses uv's parallel resolver and aggressive caching, so installs and upgrades are much faster.
Use cases:
- You already use
uvfor project dependency management and want one tool for everything. - Speed matters (CI cold-installs, frequent reinstalls).
- You want lockfile-like reproducibility for tool installs.
Comparison
| Tool | Isolation | Speed | Reproducibility | Cross-platform | Recommended for |
|---|---|---|---|---|---|
| pip (system) | None (shared env) | Medium | Manual | macOS / Linux / Windows | Avoid for global tools |
| pip (venv) | Per-venv | Medium | Manual via requirements.txt |
macOS / Linux / Windows | Contributors, CI |
| pipx | Per-tool venv (automatic) | Medium | Pin via == |
macOS / Linux / Windows | Default for global tool install |
| uv tool | Per-tool venv (automatic) | Fast | Pin via ==; uv caches resolutions |
macOS / Linux / Windows | Teams standardizing on uv |
Why isolation matters
When you pip install spec-kitty-cli into a system Python, the install shares site-packages with every other Python program on the machine. A future pip install some-other-tool can silently upgrade a dependency that breaks spec-kitty. With pipx or uv tool, each tool has its own venv, so dependency conflicts cannot happen.
This is also why modern distributions (Ubuntu 24.04, Debian 12, Fedora) refuse pip install against system Python — PEP 668 declares those interpreters externally managed, and direct installs corrupt the OS.
Why contributors use pip in a venv
If you are working on Spec Kitty (not just with it), you clone the repository and install in editable mode:
git clone https://github.com/Priivacy-ai/spec-kitty
cd spec-kitty
python -m venv .venv
source .venv/bin/activate
pip install -e .
Editable mode (-e .) means edits to src/specify_cli/ are picked up immediately. Neither pipx nor uv tool are designed for that workflow — they are about installing finished applications.
Common quirks
pip
- Direct installs against modern system Python fail with
externally-managed-environment. This is correct behavior — switch to pipx, uv tool, or a venv. pip install --userputs scripts in~/.local/bin, which may not be on PATH.pip install --upgradeupgrades to the latest matching version, but does not remove obsolete dependencies. Usepip-autoremoveor a fresh venv if cleanliness matters.
pipx
- The shim directory (
~/.local/bin) must be on PATH.pipx ensurepathhandles this once. pipx upgrade spec-kitty-clionly sees PyPI; for git installs, usepipx install --force.pipx reinstallis occasionally needed after major Python upgrades (3.11 → 3.12) so the tool venv uses the new interpreter.
uv tool
- The shim directory varies by installer (Astral installer uses
~/.local/binin current releases; older installers used~/.cargo/bin). Verify withuv tool dir --bin. uv toolandpipxcannot manage the same installation — pick one tool per machine forspec-kitty-cli.uv tool upgrade <name>requires the tool to have been originally installed viauv tool install.
Recommendation
For most users, pipx is the right default. It is:
- Officially blessed by the Python packaging ecosystem.
- Available on every major distribution.
- Self-contained —
pipx install spec-kitty-cliis one command.
If your team has already standardized on uv, prefer uv tool install spec-kitty-cli so all your Python tooling lives in the same place.
Only fall back to pip in a venv when you are managing the venv intentionally (contributors, CI/CD, special interpreters).