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
pipboth install packages from PyPI (or locally).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 |
|
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> install ...runspipagainst a tool’s venv, oruv pipunder the uv backend.--include-depsexposes entry points from every dependency.uvrequires 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 throughpipanduv.
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;uvauto-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;uvdownloads a wheel once and reuses it across all four.
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 for consuming applications: you install CLI apps with it.
pipenv and poetry are CLI apps for developing applications and libraries.
All three tools wrap
pipand 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¶
venvis part of Python’s standard library in Python 3.2 and above.venvcreates “virtual environments”, which are sandboxed Python installations.Under the pip backend, pipx creates its environments with
venv.
Example: pipx installs packages into environments created with venv, pipx install black --backend pip
--verbose.
pipx vs pyenv¶
pyenv manages Python versions on your system. It installs versions such as Python 3.11 and 3.12.
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 pyenv installed python3.11.
pipx vs pipsi¶
pipx and pipsi both install packages in a similar way.
pipx is under active development;
pipsi’s author no longer maintains it.pipx keeps its shared
pipupgraded, refreshing it every 30 days under the pip backend.pipx can run an app in one line, leaving your system unchanged after it finishes (
pipx run APP);pipsicannot.pipx can recursively install binaries from dependent packages.
pipx has more CLI options such as
upgrade-all,reinstall-all, anduninstall-all.pipx requires Python 3.11+ and, under the pip backend, uses the standard-library
venvpackage.pipx works with a Python installed by brew, while
pipsidoes 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
brewand pipx install CLI tools.They install from different sources:
brewuses its own curated repository, and pipx generally usesPyPI.
Example: brew can install pipx, but otherwise the two do not interact.
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.npxworks with JavaScript and pipx works with Python.pipx can also install tools globally;
npxcannot.
No example: the two tools serve different languages.
pipx vs pip-run¶
pip-run runs arbitrary Python code in ephemeral environments, while pipx runs Python binaries in ephemeral and non-ephemeral environments.
For example, these two commands both install poetry to an ephemeral environment and invoke it 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’s comment syntax and pipx run let you specify a script’s dependencies in specially formatted comments, but the exact syntax differs. pipx follows a provisional specification;
fadesfollows no standard.Both tools automatically set up reusable virtualenvs containing the necessary dependencies.
Both can download Python scripts or packages to execute from remote resources.
fadescan 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 for general use, rather than only for running command-line
applications.
The pactivate repository has a detailed comparison; in short:
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.11 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.