Comparisons¶
pipx vs pip¶
pip is a general Python package installer. It can install libraries or CLI applications with entry points.
pipx is a specialized package installer. It can only install packages with CLI entry points.
pipx and pip both install packages from PyPI (or locally).
pipx relies on pip (and venv).
pipx replaces a subset of pip’s functionality: it installs CLI applications but not libraries that you import in your code.
You can install pipx with pip.
Example: install pipx with pip, pip install --user pipx.
pipx vs uv tool¶
Both uv tool and pipx install a Python tool into its own virtual
environment and expose the tool’s console scripts on PATH. Both have a one-shot run mode (uvx and pipx run);
uvx is uv tool run. They differ in where state lives, which extra commands they ship, and how they handle managed
Python.
pipx keeps the same CLI across pip and uv backends; pipx install pipx[uv] opts you into uv-speed venv creation
without changing any commands. uv tool ships a smaller per-tool surface, then reuses the rest of uv for free:
managed Python, content-addressed cache, lockfiles, PEP 723 script handling.
Where state lives¶
State |
pipx |
uv tool |
|---|---|---|
Per-tool venvs |
|
|
Exposed binaries |
|
|
Man pages |
|
not exposed |
Shared pip/setuptools/wheel |
|
none; uv venvs ship without pip |
Ephemeral run cache |
|
|
Standalone Python |
|
|
System-wide install |
|
not supported |
PIPX_BIN_DIR and UV_TOOL_BIN_DIR both default to ~/.local/bin on Unix, so installing the same tool with both
managers writes the same filename. Each manager refuses to overwrite a binary the other one wrote without --force.
Use pipx install --suffix=... to keep two copies side-by-side; uv has no equivalent.
Subcommand mapping¶
Task |
pipx |
uv tool |
|---|---|---|
Install from PyPI |
|
|
Install from a git URL |
|
|
Install editable from path |
|
|
One-off run (no install) |
|
|
Refresh one-off run |
|
|
Show ephemeral cache |
|
|
Purge ephemeral cache |
|
|
One-off run with extra dep |
|
|
Pinned-version one-off |
|
|
Add a dep to existing tool |
|
|
Remove an injected dep |
|
rebuild without |
Upgrade one |
|
|
Upgrade all |
|
|
List installed or outdated |
|
|
Diagnose broken environments |
|
no equivalent |
Repair broken environments |
|
|
Reinstall any environment |
|
|
Run pip inside a venv |
|
not supported (no pip in uv venvs) |
PATH setup |
|
|
Show resolved env |
|
|
PEP 723 inline script |
|
|
Only in pipx¶
pipx inject/uninjectadd or remove a package in place.uv tool install --withreaches the same end state by rebuilding the venv.pipx runpip <venv> -- ...runs pip inside a tool’s venv. uv venvs have no pip.--include-depsexposes entry points from every dependency. uv requires you to enumerate dep packages with--with-executables-from.--suffixkeeps two copies of the same tool side-by-side.--globaland thePIPX_GLOBAL_*variables drive a system-wide install.Manual pages get symlinked under
$PIPX_MAN_DIR.pipx manifest sync <manifest>applies an explicit desired set;pipx manifest lock <manifest>writes one PEP 751 lock per selected tool.pipx install-all <spec.json>rebuilds every venv from apipx list --output jsonsnapshot for cross-machine migration.[project.entry-points."pipx.run"]declares pipx-specific runtime extras in the package metadata.pipx environmentprints every variable and its resolved value in one place.--cooldown DAYSprovides the same release-age policy through pip and uv.
Only in uv tool¶
uv tool listtoggles columns via--show-with,--show-paths,--show-version-specifiers,--show-extras,--show-python.uvx --with-editable PATHadds editable extras for a one-off run.uv tool upgrade --all -p 3.13re-pins every tool to a different Python in one shot.uv python install/list/find/pin/upgrade/uninstallintegrates managed Python; uv auto-fetches when the requested Python isn’t installed.--torch-backendand--isolatedadd controls that pipx does not expose.The content-addressed cache spans
uv pip,uv tool,uv run, anduv venv. Wheels downloaded once get reused everywhere.
Gotchas¶
uvxreuses cached envs across invocations until you prune the cache (uv cache clean), pin a new version (uvx black@latest), or pass--refresh.pipx runcaches for 14 days and accepts--refreshfor an early replacement.uvxprefers a persistent install when one exists. Afteruv tool install ruff, plainuvx ruffreuses that env instead of building an ephemeral one. Pass--isolatedto bypass.uv toolignores project-local.python-versionfiles.uv runhonors them; tool envs do not. pipx never reads them; pass--pythonor setPIPX_DEFAULT_PYTHON.uv python upgradeonly bumps patch versions. To move a tool from 3.12 to 3.13 runuv tool upgrade --all -p 3.13. pipx’s equivalent isreinstall-all --python python3.13.uv run --scriptneeds a real on-disk path. Whenpipx run script.pycontent arrives via URL or named pipe, the uv backend falls back to building a venv.
Picking one¶
pipx wins when you need its tool-specific extras: inject/uninject, --global, --suffix, manual pages, or
pipx install-all for migration. Install pipx[uv] to keep that surface and pick up uv-speed venv creation. Reach
for uv tool when you already drive uv for managed Python or uv run --script and want one binary for everything.
Running both is fine; the only collision point is the shared bin dir, and both sides refuse to overwrite without
--force.
pipx vs poetry and pipenv¶
pipx is used solely for application consumption: you install CLI apps with it.
pipenv and poetry are CLI apps used to develop applications and libraries.
All three tools wrap pip and virtual environments for more convenient workflows.
Example: install poetry with pipx, pipx install poetry; run poetry without installing it, pipx run poetry
--help.
pipx vs venv¶
venv is part of Python’s standard library in Python 3.2 and above.
venv creates “virtual environments”, which are sandboxed Python installations.
pipx relies heavily on the venv package.
Example: pipx installs packages into environments created with venv, pipx install black --verbose.
pipx vs pyenv¶
pyenv manages Python versions on your system. It helps you install versions like Python 3.11, 3.12, and so on.
pipx installs packages in virtual environments and exposes their entry points on your
PATH.
Example: install a Python interpreter with pyenv, then install a package with pipx using that interpreter, pipx
install black --python=python3.11 where python3.11 was installed by pyenv.
pipx vs pipsi¶
pipx and pipsi both install packages in a similar way.
pipx is under active development; pipsi is no longer maintained.
pipx always makes sure you’re using the latest version of pip.
pipx can run an app in one line, leaving your system unchanged after it finishes (
pipx run APP); pipsi cannot.pipx can recursively install binaries from dependent packages.
pipx has more CLI options such as
upgrade-all,reinstall-all, anduninstall-all.pipx is more modern. It requires Python 3.10+ and uses the standard-library
venvpackage.pipx works with Python homebrew installations while pipsi does not.
pipx lets you see each command it runs by passing
--verbose.
Migrating to pipx from pipsi¶
After you have installed pipx, run migrate_pipsi_to_pipx.py. You can do this with pipx itself:
$ pipx run https://raw.githubusercontent.com/pypa/pipx/main/scripts/migrate_pipsi_to_pipx.py
pipx vs brew¶
Both brew and pipx install CLI tools.
They install from different sources: brew uses a curated repository specific to brew, and pipx generally uses PyPI.
Example: brew can install pipx, but the two generally do not interact much.
pipx vs npx¶
Both can run CLI tools. npx searches
node_modulesand otherwise runs in a temporary environment;pipx runsearches__pypackages__and otherwise runs in a temporary environment.npx works with JavaScript and pipx works with Python.
Both make running executables written in a dynamic language as easy as possible.
pipx can also install tools globally; npx cannot.
Example: none. These tools work for different languages.
pipx vs pip-run¶
pip-run is focused on running arbitrary Python code in ephemeral environments, while pipx is focused on running Python binaries in ephemeral and non-ephemeral environments.
For example, these two commands both install poetry to an ephemeral environment and invoke poetry with --help:
pipx run poetry --help
pip-run poetry -- -m poetry --help
pipx vs fades¶
fades runs individual Python scripts inside automatically provisioned virtualenvs with their dependencies installed.
Both fades and pipx run let you specify a script’s dependencies in specially formatted comments, but the exact syntax differs. pipx’s syntax is standardized by a provisional specification; fades’s syntax is not.
Both tools automatically set up reusable virtualenvs containing the necessary dependencies.
Both can download Python scripts or packages to execute from remote resources.
fades can only run individual script files while pipx can also run packages.
pipx vs pae/pactivate¶
pae is a Bash command-line function distributed with pactivate that uses pactivate to create non-ephemeral environments focused on general use, rather than just running command-line applications.
There is a detailed comparison, but to summarize:
Similarities:
Both create isolated environments without having to specify (and remember) a directory in which to store them.
Both let you use any Python interpreter available on your system (subject to the version restrictions below).
pae advantages:
Supports all versions of Python from 2.7 upward. pipx requires 3.10 or above.
Fewer dependencies.
Easier to have multiple versions of a single program, or use different Python versions for one program.
Somewhat more convenient for running arbitrary command-line programs in virtual environments, installing multiple packages in a single environment, and activating virtual environments.
Integrates well with source repos using pactivate.
pae disadvantages:
Usable with the Bash shell only.
Slightly less quick and convenient for installing or running command-line programs from single Python packages.
Can be slower than pipx at creating virtual environments.