#############
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
=================
.. list-table::
:header-rows: 1
:widths: 24 38 38
- - State
- pipx
- uv tool
- - Per-tool venvs
- ``$PIPX_HOME/venvs/`` (``PIPX_HOME``)
- ``$UV_TOOL_DIR/`` (``UV_TOOL_DIR``)
- - Exposed binaries
- ``$PIPX_BIN_DIR`` (default ``~/.local/bin``)
- ``$UV_TOOL_BIN_DIR`` (default same)
- - Man pages
- ``$PIPX_MAN_DIR`` (default ``~/.local/share/man``)
- *not exposed*
- - Shared pip/setuptools/wheel
- ``$PIPX_HOME/shared`` (pip backend only)
- *none; uv venvs ship without pip*
- - Ephemeral run cache
- ``$PIPX_HOME/.cache`` (TTL 14 days)
- ``$UV_CACHE_DIR`` (no TTL; ``uv cache prune``)
- - Standalone Python
- ``$PIPX_HOME/py`` (``PIPX_FETCH_PYTHON``)
- ``$UV_PYTHON_INSTALL_DIR``
- - System-wide install
- ``--global``, ``PIPX_GLOBAL_*``
- *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
==================
.. list-table::
:header-rows: 1
:widths: 26 37 37
- - Task
- pipx
- uv tool
- - Install from PyPI
- ``pipx install ruff``
- ``uv tool install ruff`` (or ``uvx ruff`` for one-off)
- - Install from a git URL
- ``pipx install 'git+https://…'``
- ``uv tool install 'git+https://…'``
- - Install editable from path
- ``pipx install -e ./mypkg``
- ``uv tool install -e ./mypkg``
- - One-off run (no install)
- ``pipx run black .``
- ``uvx black .``
- - Refresh one-off run
- ``pipx run --refresh black .``
- ``uvx --refresh black .``
- - Show ephemeral cache
- ``pipx cache dir``
- ``uv cache dir``
- - Purge ephemeral cache
- ``pipx cache purge``
- ``uv cache clean``
- - One-off run with extra dep
- ``pipx run --with mkdocs-material mkdocs``
- ``uvx --with mkdocs-material mkdocs``
- - Pinned-version one-off
- ``pipx run --spec 'ruff==0.6.0' ruff check``
- ``uvx ruff@0.6.0 check``
- - Add a dep to existing tool
- ``pipx inject mkdocs mkdocs-material``
- ``uv tool install mkdocs --with mkdocs-material`` (rebuilds)
- - Remove an injected dep
- ``pipx uninject mkdocs mkdocs-material``
- *rebuild without* ``--with``
- - Upgrade one
- ``pipx upgrade ruff``
- ``uv tool upgrade ruff``
- - Upgrade all
- ``pipx upgrade-all``
- ``uv tool upgrade --all``
- - List installed or outdated
- ``pipx list`` (``--outdated``, ``--output json``)
- ``uv tool list`` (``--show-with``, ``--outdated``, …)
- - Diagnose broken environments
- ``pipx health``
- *no equivalent*
- - Repair broken environments
- ``pipx repair ruff`` / ``repair``
- ``uv tool install ruff`` / *no bulk equivalent*
- - Reinstall any environment
- ``pipx reinstall ruff`` / ``reinstall-all``
- ``uv tool upgrade --reinstall ruff`` / ``--all``
- - Run pip inside a venv
- ``pipx runpip -- pip ...``
- *not supported (no pip in uv venvs)*
- - PATH setup
- ``pipx ensurepath``
- ``uv tool update-shell``
- - Show resolved env
- ``pipx environment``
- ``uv tool dir``, ``uv tool dir --bin``, ``uv cache dir``, ``uv python dir``
- - PEP 723 inline script
- ``pipx run script.py`` (with uv backend uses ``uv run``)
- ``uv run --script script.py``
Only in pipx
============
- ``pipx inject`` / ``uninject`` add or remove a package in place. ``uv tool install --with`` reaches the same end
state by rebuilding the venv.
- ``pipx runpip -- ...`` runs pip inside a tool's venv. uv venvs have no pip.
- ``--include-deps`` exposes entry points from every dependency. uv requires you to enumerate dep packages with
``--with-executables-from``.
- ``--suffix`` keeps two copies of the same tool side-by-side.
- ``--global`` and the ``PIPX_GLOBAL_*`` variables drive a system-wide install.
- Manual pages get symlinked under ``$PIPX_MAN_DIR``.
- ``pipx manifest sync `` applies an explicit desired set; ``pipx manifest lock `` writes one PEP
751 lock per selected tool.
- ``pipx install-all `` rebuilds every venv from a ``pipx list --output json`` snapshot for cross-machine
migration.
- ``[project.entry-points."pipx.run"]`` declares pipx-specific runtime extras in the package metadata.
- ``pipx environment`` prints every variable and its resolved value in one place.
- ``--cooldown DAYS`` provides the same release-age policy through pip and uv.
Only in uv tool
===============
- ``uv tool list`` toggles columns via ``--show-with``, ``--show-paths``, ``--show-version-specifiers``,
``--show-extras``, ``--show-python``.
- ``uvx --with-editable PATH`` adds editable extras for a one-off run.
- ``uv tool upgrade --all -p 3.13`` re-pins every tool to a different Python in one shot.
- ``uv python install/list/find/pin/upgrade/uninstall`` integrates managed Python; uv auto-fetches when the requested
Python isn't installed.
- ``--torch-backend`` and ``--isolated`` add controls that pipx does not expose.
- The content-addressed cache spans ``uv pip``, ``uv tool``, ``uv run``, and ``uv venv``. Wheels downloaded once get
reused everywhere.
Gotchas
=======
- ``uvx`` reuses cached envs across invocations until you prune the cache (``uv cache clean``), pin a new version
(``uvx black@latest``), or pass ``--refresh``. ``pipx run`` caches for 14 days and accepts ``--refresh`` for an early
replacement.
- ``uvx`` prefers a persistent install when one exists. After ``uv tool install ruff``, plain ``uvx ruff`` reuses that
env instead of building an ephemeral one. Pass ``--isolated`` to bypass.
- ``uv tool`` ignores project-local ``.python-version`` files. ``uv run`` honors them; tool envs do not. pipx never
reads them; pass ``--python`` or set ``PIPX_DEFAULT_PYTHON``.
- ``uv python upgrade`` only bumps patch versions. To move a tool from 3.12 to 3.13 run ``uv tool upgrade --all -p
3.13``. pipx's equivalent is ``reinstall-all --python python3.13``.
- ``uv run --script`` needs a real on-disk path. When ``pipx run script.py`` content 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``, and ``uninstall-all``.
- pipx is more modern. It requires Python 3.10+ and uses the standard-library ``venv`` package.
- 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:
.. code-block:: console
$ 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_modules`` and otherwise runs in a temporary environment; ``pipx run``
searches ``__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``:
.. code-block:: bash
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 :doc:`pipx run
<../reference/examples>` 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.