NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2055 most downloaded on PyPI
Install and Run Python Applications in Isolated Environments
Last release today
03 Oct 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
9 years old
98 releases · first in 2017
👷 ci: pin ubuntu-26.04, clear warnings, bump deps by @gaborbernat in #2063
Full Changelog: 1.17.10...1.17.11
Hide the extra documentation TOC toggle on narrow screens. ( #2064 )
One column per quarter.
Fix local script app names in paths containing # by @maple-pwn in #2061
Full Changelog: 1.17.9...1.17.10
Remove an environment that has no pipx metadata and an interpreter that no longer runs, instead of crashing pipx uninstall and pipx uninstall-all . ( #2059 )
Derive local script command names from the filename when parent directories contain # . A script installed by an earlier release under its directory’s name no longer upgrades; uninstall it and install it again. ( #2060 )
Install a local PEP 723 script from its file when the path reads as a PyPI name ( pipx install bare.py ), contains [ , or starts with a quoted ~ , and stop the upgrade hint from suggesting a PyPI reinstall for a script. ( #2062 )
Do not push an app script's shebang past the kernel's length limit by @feiiiiii5 in #2058
Full Changelog: 1.17.8...1.17.9
Stop adding -E to an app script’s shebang when the longer line would exceed the kernel’s limit, which made the script
fail on macOS with Exec format error . ( #2058 )
Fix uninject leaving shell completion scripts behind by @00200200 in #2056
Remove leftover shell completion scripts when running pipx uninject . ( #2055 )
fix(run): preserve cache key argument boundaries by @januththedev in #2053
Full Changelog: 1.17.6...1.17.7
Prevent pipx run from sharing cached environments across different requirement lists or argument boundaries. This changes cache keys; run pipx cache purge to remove old entries. ( #2053 )
docs: fix argument order in the combined inject example by @agammann in #2044
Full Changelog: 1.17.5...1.17.6
Record each tool’s dependency group as its lock’s default so pipx manifest sync installs what pipx manifest lock wrote. Run pipx manifest lock again to fix existing locks. ( #2049 )
Fix the argument order in the combined inject command example. ( #2044 )
Use direct URL requirements for the Git install example with extras. ( #2045 )
fix(reinstall): propagate returned failures in reinstall-all by @jakezwang in #2043
Full Changelog: 1.17.4...1.17.5
Report failed environments when running pipx reinstall-all . ( #2042 )
fix(upgrade): don't claim 'latest version' for local-path installs by @DawnofGenX in #2041
Full Changelog: 1.17.3...1.17.4
pipx upgrade of a package installed from a local path, wheel, or VCS URL no longer reports “already at latest version”. It now says the package is unchanged because it is installed from a local source and that no package index was checked, and suggests reinstalling by package name to track index releases. ( #2040 )
fix(cli): validate PIPX_MAX_LOGS before logging setup by @hktitof in #2029
Full Changelog: 1.17.2...1.17.3
Report a clear error when PIPX_MAX_LOGS is not a non-negative integer, instead of crashing on every pipx command. Empty or whitespace-only values fall back to the default everywhere, including log setup. ( #2029 )
Split –pip-args the way a shell would, so a quoted path with spaces such as –find-links ‘/tmp/foo bar’ reaches pip intact instead of failing to parse. On Windows pipx now drops the quotes around each argument and keeps backslashes as path separators. ( #2033 )
Stop pipx runpip from printing uv DEBUG logs on the uv backend. ( #2035 )
List every –pip-args flag the uv backend translates instead of only four. ( #2037 )
Avoid KeyError in _REQUIRES_PYTHON_SCRIPT by @Cycloctane in #2026
Full Changelog: 1.17.1...1.17.2
Fix KeyError stderr noise when installing packages in Python3.15. ( #2026 )
tests: make utils_temp_dir work without symlink privilege by @iam-kira in #2023
Full Changelog: 1.17.0...1.17.1
pipx environment now reports PIPX_MAX_LOGS , and pipx environment –value PIPX_MAX_LOGS no longer exits with invalid choice . ( #2024 )
#2021 , #2025
📄 docs: publish llms.txt from the docs build by @gaborbernat in #2000
Full Changelog: 1.16.6...1.16.7
Fix pipx not being able to discover packages in separated platlib directories. ( #1999 )
Retry transient failures when fetching the python-build-standalone release index and downloading interpreter archives, resuming an interrupted archive download from the bytes already received instead of starting over. ( #2001 )
Correct the documented Windows default for PIPX_HOME , which resolves to %LOCALAPPDATA%pipxpipx rather than %LOCALAPPDATA%pipx . ( #2002 )
🐛 fix(run): discover entry points for inferred names by @gaborbernat in #1996
Full Changelog: 1.16.5...1.16.6
Stop appending a second .exe on Windows to the app name pipx run infers. ( #1189 )
Run the console script a package declares when pipx run infers the app name from a VCS URL, a local path, or a name it normalized, instead of passing a guess to uv tool run . Reusing that venv no longer reinstalls the package on every run. ( #1994 )
🐛 fix(upgrade): honor the version specifier with --install by @gaborbernat in #1991
Full Changelog: 1.16.4...1.16.5
Honor the version specifier when pipx upgrade –install installs a missing package. ( #1987 )
Build Windows zipapp separately by @dukecat0 in #1979
Full Changelog: 1.16.3...1.16.4
Bundle colorama and tomli in the zipapp so the single pipx.pyz works on Windows and on Python 3.10. ( #1978 , #1984 )
Fix the Release Notes link published in package metadata. ( #1980 )
PIPX_MAX_LOGS=0 now prunes the log files instead of keeping all of them. ( #1988 )
Fix the documentation links that 404 after the Sphinx move, including the PyPI Release Notes link. ( #1980 )
#1989
📝 docs: update Linux install guidance by @vigneshakaviki in #1977
Full Changelog: 1.16.2...1.16.3
Allow read-only global list commands when venv lock files are inaccessible. ( #1974 )
Direct Linux users to PEP 668-compatible installation methods. ( #1976 )
👷 ci: test against Python 3.15 beta by @gaborbernat in #1971
Full Changelog: 1.16.1...1.16.2
Stop venv inspection from crashing on Python 3.15 when a dist-info directory has no Name metadata field. importlib.metadata now raises KeyError for missing metadata keys instead of returning None ; such distributions are skipped again, as on earlier Python versions. ( #1971 )
📝 docs: strip the prompt from copied console snippets by @gaborbernat in #1962
Full Changelog: 1.16.0...1.16.1
Stop install and list from crashing when the pipx bin directory contains an executable pipx did not create. Scanning for launcher ownership decoded arbitrary binary content as an interpreter path, which raised UnicodeDecodeError on Windows, or ValueError for a path holding a NUL byte. Such a file is now treated as not owned by the venv. ( #1965 )
📝 docs: restore the 1.16.0 changelog fragments by @gaborbernat in #1961
Full Changelog: 1.15.2...1.16.0
Add pipx list –outdated and JSON output. ( #149 )
Honour the requires-python a package declares. When the default interpreter fails it, pipx looks for one on the system that satisfies it and builds the environment there, so pipx install mytool no longer needs the user to work out the right –python . Pass –fetch-python=missing to let pipx download a matching interpreter when the system carries none, and name –python yourself to keep the last word. ( #387 )
Normalize inferred pipx run package names. ( #618 )
Allow pipx list to select installed packages by name. ( #640 )
Add –output to structured commands. ( #828 )
Freeze the structured result envelope at pipx_result_version 1. Every –output json document now carries the command as a list of CLI tokens, a status of success , partial , or error , the process exit_code , the command data , and a top-level errors list whose entries each have a stable code and message alongside the environment and package they concern. A failure that stops a command before it builds a result renders the same envelope. ( #828 )
Add quiet and JSON output for package maintenance. ( #828 )
Give pipx reinstall and pipx reinstall-all the structured output the other commands carry. They printed straight to the terminal, so –quiet left uninstalled NAME! behind and no –output json existed to read the result from a script. Both now report through the shared renderer. ( #828 )
Give pipx cache , pipx interpreter , pipx upgrade-shared , pipx manifest lock and pipx manifest sync the structured output the other commands carry, so –quiet silences them and –output json hands a script the result. The cache and interpreter subcommands take –quiet and –verbose for the first time, since the shared options had passed them by. pipx ensurepath goes on printing its guidance, because its job is to tell a person what to add to a shell profile. ( #828 )
Add –output json to pipx inject and pipx uninject . ( #828 )
Infer the app name when running packages from VCS URLs. ( #854 )
Stream installer output during verbose installs. ( #1069 )
Draw the download progress bar of pip and uv during a plain pipx install , in place of the pipx spinner. pipx hands the installer a pseudo-terminal, which is the only way uv reports progress, and asks uv for its default output rather than the quiet one. A redirected stream keeps the previous behaviour. ( #1069 )
Allow commands to skip shared-library maintenance. ( #1278 )
Install PEP 723 scripts as persistent applications. ( #1388 )
Point library install errors to inject and –preinstall . ( #1411 )
Add commands to diagnose and repair broken environment interpreters. ( #1442 )
Add explicit tool manifests with separate PEP 751 locks. ( #1506 )
Add pipx install –upgrade to reconcile apps with package specs. ( #1572 )
Expose the shell completion scripts a package ships, the way pipx already exposes its man pages. A wheel that installs into share/bash-completion/completions , share/zsh/site-functions or share/fish/vendor_completions.d gets those files linked under PIPX_COMPLETION_DIR , which defaults to ~/.local/share . bash and fish read those locations on their own; zsh needs the site-functions directory on its fpath . Uninstalling the package takes the links away. ( #1604 )
Add pipx reset , which uninstalls every pipx-managed package and removes the shared libraries, the caches, the standalone interpreters, the logs and the trash, so pipx starts over from a fresh install. It asks before it removes anything, –yes answers for a script, and –dry-run lists what would go. ( #1606 )
Add Python interpreter arguments to pipx run . ( #1613 )
Add commands to hide and restore resources exposed from an environment. ( #1645 )
Install the generated pipx manual page from wheels. ( #1657 )
Add pipx cache and pipx run –refresh . ( #1681 )
Add –include-apps-from for selected dependencies. ( #1725 )
Add pipx exec ENVIRONMENT APPLICATION for installed environments. ( #1726 )
Support injecting extras into a main package. ( #1805 )
Install from PEP 751 lock files. ( #1807 )
Add dependency cooldowns. ( #1811 )
Validate requested apps and restore prior environments on failure. ( #1908 )
Default PIPX_HOME to the platform data directory on macOS and Windows again, which restores ~/Library/Application Support/pipx on macOS. platformdirs reads XDG_DATA_HOME and XDG_CACHE_HOME on macOS, so exporting those moves the pipx directories. A pipx home from an earlier release keeps working as a fallback. ( #1946 )
Group the manifest commands under pipx manifest : use pipx manifest lock and pipx manifest sync in place of the top-level pipx lock and pipx sync . Keeping both verbs under one noun matches pipx cache and pipx interpreter and leaves the top-level command list about the manifest rather than two loose verbs.
Keep –json only on pipx list , where it prints the versioned package snapshot that install-all reads back. Every other command dropped the –json alias in favour of –output json , so the snapshot format and the result envelope no longer share a flag.
Name the existing-environment argument ENVIRONMENT across inject , uninject , expose , unexpose , pin , unpin , uninstall , reinstall , and exec , and fix the uninject help, which described the argument as the environment to inject into rather than uninject from.
Record the interpreter and backend in the structured install , upgrade , and upgrade-all results, list PIPX_GLOBAL_COMPLETION_DIR in pipx environment , and show the shell-completion directory in pipx list . Completions had a global override that pipx honoured but never surfaced, and the records omitted which Python and backend produced a venv.
Rename –include-apps-from to –include-resources-from and the manifest key to match. The option always exposed manual pages and shell completions alongside apps, so the new name describes what it does; –include-apps keeps its name. A venv recorded under the old key is migrated on read.
Check a candidate interpreter’s real patch version against requires-python . pipx matched only on the minor version, so it rejected an installed 3.13.7 for >=3.13.5 and accepted 3.14.6 for <3.14.1 . It now queries each resolved interpreter and keeps the first whose full version satisfies the constraint. ( #387 )
Keep existing exposed files when copy-based environments provide the same resource name. ( #540 )
Recover custom paths when pipx manages its own installation on Unix. ( #774 )
Keep install failures in JSON with the correct environment. ( #828 )
Show injected apps in pipx list on systems that copy launchers. ( #997 )
Serialize shared-library maintenance across pipx processes. ( #1056 )
Wait for an installation before listing its environment. ( #1056 )
Draw the installer progress bar while the download runs. pipx reads the installer output over a pipe, which hid the terminal from pip , so pip held its bar back and printed a finished one once the download had ended. ( #1069 )
Preserve symlinks in PIPX_HOME when creating environments. ( #1327 )
Create Windows launchers for PEP 723 scripts. ( #1388 )
Preserve the terminal encoding for applications started by pipx run . ( #1423 )
Make ensurepath –global update the system PATH configuration instead of root’s shell profiles. ( #1452 )
Refresh pipx_metadata.json after pipx runpip … install replaces the main package, so future upgrade and reinstall commands stop following a stale editable source path. ( #1473 )
Accept bare local Git and Mercurial URLs such as git+file:///path/to/repository@revision . ( #1583 )
Recreate the shared environment when pip cannot run. ( #1606 )
Resolve local –find-links paths before pipx changes the working directory. ( #1637 )
Keep pipx startup usable when locked files prevent trash cleanup. ( #1847 )
Fix pipx run –with being silently dropped for PEP 723 scripts on the pip backend; the extra packages are now installed into the temporary venv. ( #1850 )
Fix pipx uninject leaving the injected package’s man page symlinks behind. ( #1853 )
Preserve –editable when installing a local package after a non-local package. ( #1856 )
Emit path warnings after logging setup for the active local or global context. ( #1856 )
Treat empty values for pipx path environment variables as unset. ( #1856 )
Apply a 30-second timeout to standalone Python index and archive network requests. ( #1856 )
Enforce pip’s minimum supported version when shared-library upgrades include a user pin. ( #1856 )
Remove exposed apps that use a venv suffix when uninjecting packages. ( #1856 )
Report corrupt venv metadata as missing without aborting list and bulk commands. ( #1856 )
Return user-set values for the advertised pipx environment –value choices. ( #1856 )
Keep existing venv metadata when pipx cannot write its replacement. ( #1856 )
Keep trash cleanup non-fatal during directory races and failed moves. ( #1856 )
List only packages whose pin state changed during pipx unpin . ( #1856 )
Reject both Windows path separators in package names. ( #1856 )
Resolve relative paths in attached -c and -f pip arguments before invoking pip. ( #1856 )
Support standalone Python downloads on Windows ARM64. ( #1856 )
Avoid import crashes when stderr or its encoding is unavailable. ( #1856 )
Keep Windows uninject working while an exposed app runs. ( #1856 )
Translate pip binary and trusted-host options to valid uv run arguments, and reject –no-deps before invoking uv. ( #1856 )
Validate members before extracting a standalone Python archive on Python 3.10.0-3.10.11, which predate tarfile’s data filter. pipx now refuses any entry whose path or link target would escape the download directory instead of falling back to an unfiltered extraction. ( #1856 )
Return a resolution error when standalone Python lacks a build for the current platform. ( #1856 )
Prevent install –force from saving its internal –force-reinstall option in package metadata. ( #1856 )
Continue bulk interpreter upgrades after finding a corrupt standalone interpreter. ( #1856 )
Skip shared-library maintenance for no-op installs. ( #1856 )
Compare metadata versions by parsed release components when selecting shared libraries. ( #1856 )
Wait for the animation thread to stop before clearing its final frame. ( #1856 )
Preserve standalone archive extraction on Python 3.10 releases without the tar filter API. ( #1856 )
Preserve noncanonical package prefixes when completing names of installed virtual environments. ( #1856 )
Preserve stored pip arguments for injected packages during pipx upgrade –include-injected . ( #1856 )
Preserve caller-owned pip arguments when creating the shared-library environment. ( #1856 )
Use tar’s data filter when extracting standalone Python archives for consistent safety. ( #1856 )
Skip cache tag files when removing expired pipx run environments. ( #1856 )
Allow forced installs in existing uv environments. ( #1924 )
Store the venv cache and the logs in the platform cache and log directories on every platform, and keep them out of a pipx home that only exists for backwards compatibility. Setting PIPX_HOME still keeps both inside it. ( #1946 )
Retry fetching a standalone Python build when GitHub’s release CDN returns a transient error, so a momentary 5xx or rate-limit response no longer fails the install. ( #1960 )
Apply pipx manifest lock as all-or-nothing. When a manifest declares locks for several tools, pipx wrote the regenerated files one at a time, so a failure partway left some locks new and others old. Each target is now backed up before it is replaced and every applied lock is rolled back if any replacement fails.
Apply a 30-second timeout and a 10 MiB size limit when downloading a remote pipx run or pipx install script, so a stalled or oversized URL can no longer hang pipx or exhaust memory. pipx run also accepts a script URL with a query string, such as tool.py?raw=1 , by matching on the URL path.
Gate a PyPI release on the test suite and validate the built artifacts before publishing. The release workflow now runs the full test matrix for the tagged commit, checks the distributions with twine , and confirms the built version matches the tag, so a broken build or a mismatched tag cannot reach PyPI.
Honour a script’s PEP 723 requires-python on the pip-backed pipx run . Without an explicit –python , pipx now picks an interpreter that satisfies the constraint, matching what the uv backend already does; with an explicit –python that fails the constraint it reports a clear error instead of running on an unsupported interpreter. A malformed inline metadata block now produces a readable message rather than a traceback.
Include pipx run –with packages in the run-cache key. Because they were absent, pipx run TOOL and pipx run –with EXTRA TOOL shared one cached environment, so extras injected by one invocation leaked into later runs that asked for none. Each distinct set of extras now gets its own environment, and the extras are injected only when that environment is first built.
Keep the backups that install –force and reinstall take while replacing an environment in pipx’s trash rather than beside the live environments. A backup placed in the venvs directory was picked up as a broken environment by a concurrent list or reinstall-all ; the trash shares the home’s filesystem, so restoring a backup is still an atomic rename.
Make a standalone Python upgrade atomic. pipx used to delete the existing interpreter before downloading its replacement, so a failed download or unpack left no interpreter at all. The new build is now staged beside the old one and swapped in only once it is complete, and a failed swap restores the previous build.
Make the expired-cache sweep that runs before pipx run non-blocking. pipx used to wait for a lock on every other cached environment, so a concurrent pipx run whose install held one of those locks stalled the new run, a stall that lasted the whole install on Windows. The sweep now skips any environment another run is holding.
Probe a uv found on PATH before using it, and bound every uv –version call with a timeout. A broken or hanging uv on PATH previously slipped past discovery and stalled the next command; pipx now skips such a binary and reports a clear error instead of hanging.
Reject a –suffix that contains anything but letters, digits, and the characters . _ - + @ . A suffix is spliced straight into the names of the links pipx writes into PIPX_BIN_DIR and PIPX_MAN_DIR , so a value such as /../../owned could previously place those links outside pipx’s own directories.
Remove a dropped app or man page during upgrade only when pipx still owns the exposed file, so a command a user or another package replaced is left in place.
Report pipx expose as a partial or failed operation when a resource cannot be linked because a foreign file already occupies its target name. The command previously claimed success while silently leaving those apps or manual pages unexposed; it now lists each conflict in the structured result and exits non-zero.
Stop forcing UV_NO_PROGRESS=1 on every uv call. The override silenced uv’s progress bar even when pipx asked to draw one, and it ignored a UV_NO_PROGRESS already set in the environment. pipx now suppresses the bar only in quiet, JSON, and non-interactive runs, and defers to the caller’s UV_NO_PROGRESS when it does want progress shown.
Track exposed shell completions through the full environment lifecycle. Stale-resource cleanup during install, upgrade, and reinstall, the repair relink check, and the ownership filter now include completions alongside apps and manual pages, so a completion a package stops shipping is removed instead of lingering.
Check upgrades in parallel and skip installs for current packages. ( #1353 )
Index installed distributions during environment inspection. ( #1856 )
Cache each managed environment’s site-packages path. ( #1856 )
Read environment metadata once per interpreter upgrade. ( #1856 )
Cache shared-library validity checks within each pipx process. ( #1856 )
List managed environments only when shell completion requests them. ( #1856 )
Cache resolved pipx context paths. ( #1856 )
Compute only the requested pipx environment –value entry. ( #1856 )
Reuse the pipx run PATH lookup when warning about an existing app. ( #1856 )
Resolve the default Python interpreter on first use instead of import. ( #1856 )
Inspect legacy environments once during uninstall and reinstall. ( #1856 )
Document the pipx application scope and feature boundaries. ( #177 )
Remove the PIPX_HOME_ALLOW_SPACE environment variable and the warning about spaces in the pipx home path. pip and uv both write a /bin/sh wrapper as the shebang when the interpreter path contains a space, so applications installed into such a path run. ( #1946 )
Full Changelog : 1.15.1...1.15.2
Full Changelog: 1.15.1...1.15.2
<!-- Release notes generated using configuration in .github/release.yml at 1.15.1 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.15.1 -->
--with being dropped for PEP 723 scripts on the pip backend by @2ykwang in https://github.com/pypa/pipx/pull/1849Full Changelog: https://github.com/pypa/pipx/compare/1.15.0...1.15.1
<!-- Release notes generated using configuration in .github/release.yml at 1.15.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.15.0 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.14.1...1.15.0
Add a --dry-run flag to pipx ensurepath that reports which directories would be added to PATH without modifying PATH or any shell configuration file. ( #1014 )
Fix pipx uninject for uv-backed environments, where uv lacks pip’s list --not-required option. Both backends now derive the not-required set from installed distribution metadata, so they behave identically, and a dependency pulled in only by another package’s extra is kept instead of being treated as removable. ( #1841 )
<!-- Release notes generated using configuration in .github/release.yml at 1.14.1 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.14.1 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.14.0...1.14.1
Restore the original package if pipx reinstall-all is interrupted during reinstall. ( #966 )
Allow importing pipx.util before pipx.paths . ( #1333 )
Ensure pipx inject --force reinstalls injected packages without persisting the force-reinstall option in package metadata. ( #1545 )
Preserve installer errors when package-name detection fails during local package installs. ( #1567 )
Expose manual pages for editable local package installs. ( #1793 )
Fixed pipx pin <app> --injected-only so it can pin injected packages when the main app is already pinned. ( #1835 )
<!-- Release notes generated using configuration in .github/release.yml at 1.14.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.14.0 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.13.0...1.14.0
Add --no-path-check to pipx run to skip the warning when the app is already on PATH . Useful for shim scripts that wrap pipx run <app> under the same name as the app. ( #1824 )
Add regression coverage for pipx inject accepting --force before or after injected dependencies. ( #1444 )
Use the bootstrap pipx executable when adding PATH in self-managed installs. ( #1481 )
Update deprecation message in get-pipx.py; obsoleted, not deprecated by @Spitfire1900 in https://github.com/pypa/pipx/pull/1813
<!-- Release notes generated using configuration in .github/release.yml at 1.13.0 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.12.0...1.13.0
Add PIPX_DISABLE_SHARED_LIBS_AUTO_UPGRADE to skip automatic shared library upgrades. ( #1650 )
Update the error message in get-pipx.py; it is obsoleted, not deprecated. ( #1813 )
Install app scripts with shebangs that ignore PYTHONPATH . ( #1584 )
Refresh cached standalone Python indexes written by older pipx versions before using --fetch-missing-python . ( #1774 )
Document how to clear cache warnings from runpip . ( #1802 )
<!-- Release notes generated using configuration in .github/release.yml at 1.12.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.12.0 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.11.2...1.12.0
Add --fetch-python and PIPX_FETCH_PYTHON to control standalone Python downloads, with values always , missing , or never . ( #1663 )
Add an opt-in uv backend. Install pipx[uv] (or put uv on PATH ) and pipx will create venvs with uv venv , manage packages with uv pip , and run ephemeral apps via uv tool run .
Default change: when uv is reachable, pipx uses it for new venvs by default. Existing venvs keep their recorded backend; flipping a venv requires pipx reinstall NAME --backend X . Set PIPX_DEFAULT_BACKEND=pip to force pip even when uv is available, or pass --backend pip per command. pipx install pip always picks the pip backend (uv venvs have no pip).
Selection precedence: --backend > recorded venv metadata > PIPX_DEFAULT_BACKEND > auto-detect. The env var sits below metadata so setting PIPX_DEFAULT_BACKEND=uv does not silently retarget existing pip-backed venvs; the recorded backend wins until you flip it explicitly. pipx environment exposes the resolved backend and its source as PIPX_RESOLVED_BACKEND and PIPX_BACKEND_SOURCE .
Metadata version bump: the venv metadata file format moves from 0.5 to 0.6 to record the chosen backend. Running this pipx version against an existing venv rewrites its metadata to 0.6 on the next install/upgrade. If you downgrade pipx after that, the older version raises Unknown metadata version 0.6 and you’ll need to reinstall the affected venvs from the older pipx ( pipx reinstall NAME ). ( #1808 )
Deprecate --fetch-missing-python and PIPX_FETCH_MISSING_PYTHON ; both are now aliases for --fetch-python=missing / PIPX_FETCH_PYTHON=missing . PIPX_FETCH_MISSING_PYTHON=0 (and other falsy values) now disables fetching, where previously any value enabled it. The pipx.interpreter.find_python_interpreter keyword fetch_missing_python: bool is replaced by fetch_python: FetchPythonOptions . ( #1663 )
<!-- Release notes generated using configuration in .github/release.yml at 1.11.2 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.11.2 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.11.1...1.11.2
Add pipx help and pipx help <command> aliases for existing help output. ( #1535 )
Drop support for Python 3.9. ( #1786 )
Replace if/elif command dispatch in main.py with argparse set_defaults. ( #1794 )
<!-- Release notes generated using configuration in .github/release.yml at 1.11.1 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.11.1 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.11.0...1.11.1
Ignore PIP_TARGET environment variable to prevent pip from installing outside the venv. ( #735 )
Fix pipx install failing on Windows when the username contains non-Latin characters (e.g. cyrillic, Chinese). ( #780 )
Show installed version and suggest upgrade when install detects an existing installation. ( #795 )
--verbose and --quiet flags before the subcommand are no longer silently ignored. ( #1282 )
Remove dependency app symlinks when uninjecting a package that was injected with --include-deps . ( #1364 )
Remove setuptools from shared libs to prevent version conflicts when app venvs use a different Python. ( #1539 )
Prevent uninject from removing dependencies still needed by other packages in the venv. ( #1672 )
<!-- Release notes generated using configuration in .github/release.yml at 1.11.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.11.0 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.10.1...1.11.0
Add PIPX_MAX_LOGS environment variable to configure the maximum number of log files to keep. ( #1570 )
Allow --pip-args to be passed to upgrade-all . ( #1503 )
Fix --pip-args='-c <url>' breaking when constraint target is a URL instead of a local path. ( #1582 )
Enable keyring authentication for private package indexes by setting PIP_KEYRING_PROVIDER=subprocess ( #1603 )
Added error handling for pip list command failures ( #1698 )
Remove outdated “experimental” note from --suffix help text. ( #1621 )
<!-- Release notes generated using configuration in .github/release.yml at 1.10.1 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.10.1 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.10.0...1.10.1
Use stored pip_args from install metadata when running pipx upgrade without explicit --pip-args ( #1441 )
Fix --global flag being silently ignored when placed before the subcommand ( #1443 )
Respect --quiet flag in install and suppress animations and success messages ( #1508 )
Catch missing Python interpreter in upgrade and show helpful error instead of crashing ( #1602 )
Prevent data loss by rejecting relative paths in uninstall , reinstall , and other package-name arguments ( #1718 )
<!-- Release notes generated using configuration in .github/release.yml at 1.10.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.10.0 -->
--options when a leading - has been entered by @exploide in https://github.com/pypa/pipx/pull/1638Full Changelog: https://github.com/pypa/pipx/compare/1.9.0...1.10.0
Add --with flag to pipx run to allow injecting dependencies ( #1607 )
add more specific directions in the logs towards a resolution if you have a space in the PIX_HOME path ( #1634 )
Fixed upgrade command failing when package name includes extras (e.g., pipx upgrade "coverage[toml]" ). ( #925 )
Fix run command with bash substitution (e.g. pipx run <(pbpaste) ) ( #1293 )
Allow pipx runpip to split single string arguments. ( #1520 )
Fix handling of shared libraries when the original Python interpreter is removed on Windows by detecting stale venv references and recreating the shared libraries with the current Python. ( #1723 )
#1638 , #1731
<!-- Release notes generated using configuration in .github/release.yml at 1.9.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.9.0 -->
python-build-standalone repo path by @Paulchen5 in https://github.com/pypa/pipx/pull/1680pipx reinstall: An exception will now be raised if package is pinned by @dukecat0 in https://github.com/pypa/pipx/pull/1674pipx run from leaving bad temporary venvs by @sam-sw in https://github.com/pypa/pipx/pull/1710__package__ → __spec__.parent by @DimitriPapadopoulos in https://github.com/pypa/pipx/pull/1719Full Changelog: https://github.com/pypa/pipx/compare/1.8.0...1.9.0
Add completion choices for pipx environment --value . ( #1498 )
Ignore recursive symlink loops in PIPX_BIN_DIR. ( #1592 )
pipx reinstall : An exception will now be raised if package is pinned. ( #1611 )
Stop pipx run from leaving bad temporary venvs when first installation was unsuccessful. ( #1709 )
<!-- Release notes generated using configuration in .github/release.yml at 1.8.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.8.0 -->
/changelog/ and /contributing/ docs URLs by @br3ndonland in https://github.com/pypa/pipx/pull/1541TCH → TC by @DimitriPapadopoulos in https://github.com/pypa/pipx/pull/1626dependencies = [] by @neutrinoceros in https://github.com/pypa/pipx/pull/1658Full Changelog: https://github.com/pypa/pipx/compare/1.7.1...1.8.0
Rename environmental variable USE_EMOJI to PIPX_USE_EMOJI . ( #1395 )
Add --all-shells flag to pipx ensurepath . ( #1585 )
Add support for Python 3.13 ( #1647 )
On Windows, no longer overwrite existing files on upgrade if source and destination are the same ( #683 )
Update the logic of finding python interpreter such that --fetch-missing-python works on Windows ( #1521 )
Fix no message displayed when no packages are upgraded with upgrade-all . ( #1565 )
Fix incorrect order of flags when using pipx upgrade . ( #1610 )
Update the archive name of build of Python for Windows ( #1630 )
Set up standalone python fetching to use checksums directly from the GitHub API. ( #1652 )
Fix running a script with explicitly empty dependencies = [] . ( #1658 )
Fix /changelog/ and /contributing/ docs URLs ( #1540 )
<!-- Release notes generated using configuration in .github/release.yml at 1.7.1 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.7.1 -->
Full Changelog: https://github.com/pypa/pipx/compare/1.7.0...1.7.1
Use minimum supported Python to build zipapp in release action such that tomli is included in it. ( #1514 )
<!-- Release notes generated using configuration in .github/release.yml at 1.7.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 1.7.0 -->
pipx pin and pipx unpin commands by @dukecat0 in https://github.com/pypa/pipx/pull/1438--prepend option to the pipx ensurepath command by @agriyakhetarpal in https://github.com/pypa/pipx/pull/1451pipx install operation via --pip-args by @guysalt in https://github.com/pypa/pipx/pull/1390docs directory by @svengregorio in https://github.com/pypa/pipx/pull/1474--global installs to ~/.local) by @viscruocco in https://github.com/pypa/pipx/pull/1476pipx environment by @viscruocco in https://github.com/pypa/pipx/pull/1493Full Changelog: https://github.com/pypa/pipx/compare/1.6.0...1.7.0
Add a --prepend option to the pipx ensurepath command to allow prepending pipx ’s location to PATH rather than appending to it. This is useful when you want to prioritize pipx ’s executables over other executables in your PATH . ( #1451 )
List PIPX_GLOBAL_[HOME|BIN_DIR|MAN_DIR] in pipx environment . ( #1492 )
Introduce PIPX_HOME_ALLOW_SPACE environment variable, to silence the spaces in pipx home path warning ( #1320 )
Fix passing constraints file path into pipx install operation via pip args ( #1389 )
Add help messages for pipx pin and pipx unpin commands. ( #1438 )
Stop pipx install --global from installing files in ~/.local . ( #1475 )
Fix installation abortion on multiple packages when one or more are already installed. ( #1509 )
Move all documentation files to the docs directory. ( #1479 )
Create a dedicated documentation section for manual pages by @pawamoy in https://github.com/pypa/pipx/pull/1312
logger.warning instead of logging.warn by @mayeut in https://github.com/pypa/pipx/pull/1326upgrade command to accept multiple packages as arguments by @huxuan in https://github.com/pypa/pipx/pull/1339pipx reinstall crash with absolute path by @chrysle in https://github.com/pypa/pipx/pull/1329ensure_path by @trag1c in https://github.com/pypa/pipx/pull/1359--python arg when py launcher is n… by @huxuan in https://github.com/pypa/pipx/pull/1343--preinstall dependency instead of latest version by @davidpeckham in https://github.com/pypa/pipx/pull/1379--system-site-packages for upgrade --install by @sadamczyk in https://github.com/pypa/pipx/pull/1378ruff / ruff format sequence by @DimitriPapadopoulos in https://github.com/pypa/pipx/pull/1405pipx run entry point discovery with local path by @chrysle in https://github.com/pypa/pipx/pull/1422pipx pin and pipx unpin commands by @dukecat0 in https://github.com/pypa/pipx/pull/1291python 3.7+ -> python 3.8+ by @dukecat0 in https://github.com/pypa/pipx/pull/1426workflow_dispatch to release action by @dukecat0 in https://github.com/pypa/pipx/pull/1436Full Changelog: https://github.com/pypa/pipx/compare/1.5.0...1.6.0
Add install-all command to install packages according to spec metadata file. ( #687 )
Introduce pipx pin and pipx unpin commands, which can be used to pin or unpin the version of an installed package, so it will not be upgraded by pipx upgrade or pipx upgrade-all . ( #891 )
Add a new option --pinned to pipx list command for listing pinned packages only. ( #891 )
Add pipx interpreter upgrade command to upgrade local standalone python in micro/patch level ( #1249 )
Add --requirement option to inject command to read list of packages from a text file. ( #1252 )
Add pipx upgrade-shared command, to create/upgrade shared libraries as a standalone command. ( #1316 )
Allow upgrade command to accept multiple packages as arguments. ( #1336 )
Support Python version for --python arg when py launcher is not available ( #1342 )
Make install-all gather errors in batch ( #1348 )
Resolve the DEFAULT_PYTHON to the actual absolute path ( #965 )
Fix error log overwrite for “-all” batch operations. ( #1132 )
Do not reinstall already injected packages without --force being passed. ( #1300 )
Only show --python and --force flag warning if both flags are present ( #1304 )
Don’t allow paths to be passed into pipx reinstall , as this might wreak havoc. ( #1324 )
Make the Python venv module arguments work with upgrade --install ( #1344 )
Fix version check for standalone python ( #1349 )
Validate package(s) argument should not be path(s). ( #1354 )
Validate whether a package is an URL correctly. ( #1355 )
Support python3.8 for standalone python builds ( #1375 )
Install specified version of --preinstall dependency instead of latest version ( #1377 )
Move --global option into shared parser, such that it can be passed after the subcommand, for example pipx ensurepath --global . ( #1397 )
Fix discovery of a pipx run entry point if a local path was given as package. ( #1422 )
Create a dedicated section for manual pages and add an example with pdm-backend . ( #1312 )
Add example, test and cli help description how to install multiple packages with the –preinstall flag ( #1321 )
Refine docs generation script and template. ( #1325 )
Add a note about sourcing the shell config file for ensure_path ( #1346 )
[pre-commit.ci] pre-commit autoupdate by @pre-commit-ci in https://github.com/pypa/pipx/pull/1209
pipx install is run without arguments by @dukecat0 in https://github.com/pypa/pipx/pull/1266--install option to pipx upgrade command by @chrysle in https://github.com/pypa/pipx/pull/1267pipx completions Output by @mjs271 in https://github.com/pypa/pipx/pull/1296pipx install command description by @sgryjp in https://github.com/pypa/pipx/pull/1307Full Changelog: https://github.com/pypa/pipx/compare/1.4.3...1.5.0
Add --global option to pipx commands.
This will run the action in a global scope and affect environment for all system users. ( #754 )
Add a --fetch-missing-python flag to all commands that accept a --python flag.
When combined, this will automatically download a standalone copy of the requested python version if it’s not already available on the user’s system. ( #1242 )
Add commands to list and prune standalone interpreters ( #1248 )
Revert platform-specific directories on MacOS and Windows
They were leading to a lot of issues with Windows sandboxing and spaces in shebangs on MacOS. ( #1257 )
Add --install option to pipx upgrade command.
This will install the package given as argument if it is not already installed. ( #1262 )
Correctly resolve home directory in pipx directory environment variables. ( #94 )
Pass through pip arguments when upgrading shared libraries. ( #964 )
Fix installation issues when files in the working directory interfere with venv creation process. ( #1091 )
Report correct filename in tracebacks with pipx run <scriptname> ( #1191 )
Let self-managed pipx uninstall itself on windows again. ( #1203 )
Fix path resolution for python executables looked up in PATH on windows. ( #1205 )
Display help message when pipx install is run without arguments. ( #1266 )
Fix crashes due to superfluous -q flags by discarding exceeding values ( #1283 )
Update the completion instructions for zipapp users. ( #1072 )
Update the example for running scripts with dependencies. ( #1227 )
Update the docs for package developers on the use of configuration using pyproject.toml ( #1229 )
Add installation instructions for Fedora ( #1239 )
Update the examples for installation from local dir ( #1277 )
Fix inconsistent wording in pipx install command description. ( #1307 )
Deprecate --skip-maintenance flag of pipx list ; maintenance is now never executed there ( #1256 )
#1296
Bump changelog for 1.4.2 by @chrysle in https://github.com/pypa/pipx/pull/1202
Full Changelog: https://github.com/pypa/pipx/compare/1.4.2...1.4.3
Autofix python version for pylauncher, when version is provided prefixed with python ( #1150 )
Support building pipx wheels with setuptools-scm<7, such as on FreeBSD. ( #1208 )
Provide useful error messages when unresolvable python version is passed ( #1150 )
Introduce towncrier for managing the changelog ( #1161 )
Add workaround for using pipx applications in shebang under macOS ( #1198 )
Update "Running pipx From Source Tree" section by @chrysle in https://github.com/pypa/pipx/pull/1183
tomli in zipapp by @sgryjp in https://github.com/pypa/pipx/pull/1194Full Changelog: https://github.com/pypa/pipx/compare/1.4.1...1.4.2
Allow skipping maintenance tasks during list command
Raise more user friendly error when provided --python version is not found
Update pipx run on scripts using /// script and no run table following the updated version of PEP 723 (#1180)
Include tomli into pipx.pyz (zipapp) so that it can be executed with Python 3.10 or earlier (#1142)
Fix resolving the python executable path on linux
pipx run : Verify whether the script name provided is a file before running it
Avoid repeated exception logging in a few rare cases (#1192)
Note: This release contains a fix for the output of debug log messages in the console. They are now hidden when additional flags such as --verbose are
Note: This release contains a fix for the output of debug log messages in the console. They are now hidden when additional flags such as --verbose are not passed.
-q from list --json test by @dukecat0 in https://github.com/pypa/pipx/pull/1181Full Changelog: https://github.com/pypa/pipx/compare/1.4.0...1.4.1
Set default logging level to WARNING, so debug log messages won’t be shown without passing additional flags such as --verbose
[pre-commit.ci] pre-commit autoupdate by @pre-commit-ci in https://github.com/pypa/pipx/pull/1136
pipx commands by @chrysle in https://github.com/pypa/pipx/pull/1159Full Changelog: https://github.com/pypa/pipx/compare/1.3.3...1.4.0
Add --quiet and --verbose options for the pipx subcommands
Add ability to install multiple packages at once
Delete directories directly instead of spawning rmdir on Windows
Add Scoop installation instructions
“Failed to delete” error when using Microsoft Store Python
“No pyvenv.cfg file” error when using Microsoft Store Python (#1164)
Add @dukecat0 to volunteer list by @dukecat0 in https://github.com/pypa/pipx/pull/1134
Full Changelog: https://github.com/pypa/pipx/compare/1.3.2...1.3.3
Make the logo more visible in dark mode
Additional help for option --pip-args by @johanwiden in https://github.com/pypa/pipx/pull/1131
Full Changelog: https://github.com/pypa/pipx/compare/1.3.1...1.3.2
The project version number is now dynamic and generated from the VCS at build time
Add additional example for –pip-args option, to docs/examples.md
Make links actually links by @hynek in https://github.com/pypa/pipx/pull/1123
--editable and --force flag by @potiuk in https://github.com/pypa/pipx/pull/1124Full Changelog: https://github.com/pypa/pipx/compare/1.3.0...1.3.1
Check whether pip module exists in shared lib before performing any actions, such as reinstall-all.
reinstall-all.setuptools and wheel from the shared libraries. This results in less time consumption when the libraries are
automatically upgraded.pip with pipx runpipx run.--include-apps when running pipx inject --include-deps--with-suffix for pipx inject commandpipx install: emit a warning when --force and --python were passed at the same timepipx run show package_or_url, so extra will be printed out as well--force-reinstall to pip arguments when --force was passed--python optionpipx run (#916)pip_args to shared_libs.upgrade()$PIPX_HOME/logs) is not writable to aid with pipx being used
for multi-user (e.g. system-wide) installs of applicationspipx paths to ensure compatibility with the platform-specific user directoriespipx runpipx install --preinstall to support preinstalling build requirements--no-input to pip when output is not piped to parent stdoutpipx environmentpipx installFull Changelog: https://github.com/pypa/pipx/compare/1.2.0...1.3.0
Allow running pip with pipx run
Add --with-suffix for pipx inject command
pipx install : emit a warning when --force and --python were passed at the same time
Add explicit 3.12 support
Make usage message in pipx run show package_or_url , so extra will be printed out as well
Use the py launcher, if available, to select Python version with the --python option
add pre-commit hook support
Add pipx install --preinstall to support preinstalling build requirements
Return an error message when directory can’t be added to PATH successfully
Expose manual pages included in an application installed with pipx install
Check whether pip module exists in shared lib before performing any actions, such as reinstall-all .
Drop setuptools and wheel from the shared libraries. This results in less time consumption when the libraries are automatically upgraded.
Support inline script metadata in pipx run .
Imply --include-apps when running pipx inject --include-deps
Add --force-reinstall to pip arguments when --force was passed
Support including requirements in scripts run using pipx run (#916)
Pass pip_args to shared_libs.upgrade()
Fallback to user’s log path if the default log path ( $PIPX_HOME/logs ) is not writable to aid with pipx being used for multi-user (e.g. system-wide) installs of applications
Don’t show escaped backslashes for paths in console output
Move pipx paths to ensure compatibility with the platform-specific user directories
Pass --no-input to pip when output is not piped to parent stdout
Print all environment variables in pipx environment
Add more examples for pipx run
Add subsection to make README easier to read
Drop support for Python 3.7
Fix wrong interpreter usage when injecting local pip-installable dependencies into venvs
Fix program name in generated manual page
Note: This is a non-main release to only contain fix for the new packaging release on top of 1.2.0 without additional changes.
Note: This is a non-main release to only contain fix for the new packaging release on top of 1.2.0 without additional changes.
Add test for pip module in pipx reinstall to fix an issue with pipx reinstall-all
Add test for pip module in pipx reinstall to fix an issue with pipx reinstall-all (#935)
Add pipx uninject command (#820)
[docs] Fix pipx run examples and update Python versions used by pipx install examples
[docs] Add an example for installation from source with extras
Match pip's behaviour when package name ends with archive extension (treat it as a path)
Ship a zipapp of pipx
Change the program name to path/to/python -m pipx when running as python -m pipx
Improve the detection logic for MSYS2 to avoid entering infinite loop (#908) (#938)
Remove extra trailing quote from exception message
Fix EncodingWarning in pipx_metadata_file.
pipx uninject command by @meowmeowmeowcat in https://github.com/pypa/pipx/pull/820path/to/python -m pipx when running as python -m pipx by @meowmeowmeowcat in https://github.com/pypa/pipx/pull/852testdata/tests_packages and generate missing ones by @Jackenmen in https://github.com/pypa/pipx/pull/871Full Changelog: https://github.com/pypa/pipx/compare/1.1.0...1.2.0
Add pipx uninject command (#820)
Ship a zipapp of pipx
Match pip’s behaviour when package name ends with archive extension (treat it as a path)
Change the program name to path/to/python -m pipx when running as python -m pipx
Improve the detection logic for MSYS2 to avoid entering infinite loop (#908) (#938)
Remove extra trailing quote from exception message
Fix EncodingWarning in pipx_metadata_file .
Add an example for installation from source with extras
Fix pipx run examples and update Python versions used by pipx install examples
Add test for pip module in pipx reinstall to fix an issue with pipx reinstall-all (#935)
Fix encoding issue on Windows when pip fails to install a package
shlex.split on Windows, so paths on Windows can be handled peoperly when they are passed in --pip-args. (#794)pipx environment command (#793)list --short option to list only package names (#804)shlex.split on Windows by @meowmeowmeowcat in https://github.com/pypa/pipx/pull/794pipx environment command by @meowmeowmeowcat in https://github.com/pypa/pipx/pull/793Full Changelog: https://github.com/pypa/pipx/compare/1.0.0...1.1.0
Add pipx environment command (#793)
Add list --short option to list only package names (#804)
Improve the behaviour of shlex.split on Windows, so paths on Windows can be handled properly when they are passed in --pip-args . (#794)
[dev] Change github action job names
Add additional examples for installation from git repos
[packaging] Switch to PEP 621
Add a CACHEDIR.TAG to the cache directory to prevent it from being included in archives and backups. For more information about cache directory tags, see https://bford.info/cachedir
Fix encoding issue on Windows when pip fails to install a package
Add more examples
Fix the command for installing development version . (#801)
Fix test status badge in readme file
Nothing published for this version
- Include machinery to build a manpage for pipx with argparse-manpage .
Support argcomplete 2.0.0 (#790)
Include machinery to build a manpage for pipx with argparse-manpage .
Add better handling for ‘app not found’ when a single app is present in the project, and an improved error message (#733)
Fixed animations sending output to stdout, which can break JSON output. (#769)
Fix typo in pipx upgrade-all output
- Support pipx run with version constraints and extras.
Support pipx run with version constraints and extras. (#697)
- Fixed pipx list output phrasing to convey that python version displayed is the one with which package was installed.
Fixed pipx list output phrasing to convey that python version displayed is the one with which package was installed.
Fixed pipx install to provide return code 0 if venv already exists, similar to pip’s behavior. (#736)
[docs] Update ansible’s install command in Programs to Try document to work with Ansible 2.10+ (#742)
- Fix to pipx ensurepath to fix behavior in user locales other than UTF-8, to fix #644. The internal change is to use userpath v1.6.0 or greater.
Fix to pipx ensurepath to fix behavior in user locales other than UTF-8, to fix #644. The internal change is to use userpath v1.6.0 or greater. (#700)
Fix virtual environment inspection for Python releases that uses an int for its release serial number. (#706)
Fix PermissionError in windows when pipx manages itself. (#718)
Organization: pipx is extremely pleased to now be a project of the Python Packaging Authority (PyPA)! Note that our github URL has changed to pypa/pip
pipx list --json to return valid json with no venvs installed. Previously would return an empty string to stdout. (#681)pipx ensurepath bash behavior so that only one of {~/.profile, ~/.bash\_profile} is modified with the extra pipx paths, not both. Previously, if a .bash_profile file was created where one didn't exist, it could cause problems, e.g. #456. The internal change is to use userpath v1.5.0 or greater. (#684)nox -s tests_internet or pytest --net-pypiserver tests. (#686)Changed non-venv-info warnings and notices from pipx list to print to stderr. This especially prevents pipx list --json from printing invalid json to
pipx list to print to stderr. This especially prevents pipx list --json from printing invalid json to stdout. (#680)Fixed bug #670 where uninstalling a venv could erroneously uninstall other apps from the local binary directory.
--json switch to pipx list to output rich json-metadata for all venvs.Introduce the pipx.run entry point group as an alternative way to declare an application for pipx run.
pipx.run entry point group as an alternative way to declare an application for pipx run. (#615)pipx list (#624).reinstall-all, fixed bug where missing python executable would cause error. (#634)__pypackages__ folder). (#636)New venv inspection! The code that pipx uses to examine and determine metadata in an installed venv has been made faster, better, and more reliable. I
packaging and importlib.metadata to examine installed venvs. It also now properly handles installed package extras. In addition, some problems pipx has had with certain characters (like periods) in package names should be remedied.pipx run on non-Windows systems to actually replace pipx process with the app process instead of running it as a subprocess. (Now using python's os.exec*)PIPX_DEFAULT_PYTHON value when generating web documentation for pipx install #523., -, _ characters are interchangeable.)., -, or _ characters in a row are equivalent. (e.g. if you have a suffixed venv pylint_1.0A you could not add another suffixed venv called pylint--1-0a, as it would not be a unique name.)., -, _ characters are all equivalent.)reinstall-all.pipx upgrade) were wrong. The exit code from pipx runpip is now the exit code from the pip command run. The exit code from pipx list will be 1 if one or more venvs have problems that need to be addressed.$PIPX_HOME/logs, typically ~/.local/pipx/logs. pipx keeps the most recent 10 logs and deletes others.pipx upgrade and pipx upgrade-all now have a --upgrade-injected option which directs pipx to also upgrade injected packages.pipx list now detects, identifies, and suggests a remedy for venvs with old-internal data (internal venv names) that need to be updated.[bugfix] Fixed regression in list, inject, upgrade, reinstall-all commands when suffixed packages are used.
pipxensurepath and completions help[docs] Update license
[docs] Display a more idiomatic command for registering completions on fish.
[bugfix] Fixed regression in list, inject, upgrade, reinstall-all commands when suffixed packages are used.
[bugfix] Do not reset package url during upgrade when main package is pipx
Updated help text to show description for ensurepath and completions help
Added support for user-defined default python interpreter via new PIPX_DEFAULT_PYTHON . Helpful for use with pyenv among other uses.
[bugfix] Fixed bug where extras were ignored with a PEP 508 package specification with a URL.
[bugfix] Fixed regression of 0.15.5.0 which erroneously made installing from a local path with package extras not possible.
Your coding agent can read these notes before it upgrades. Set up the MCP server →