一句话:pip 是包管理器,pipx 是基于 pip 的"命令行工具安装器"。两者解决的是 Python 生态里两个不同的问题------库的依赖 vs 应用的依赖。
本质区别
| pip | pipx | |
|---|---|---|
| 定位 | 通用包管理器,装任何 Python 包 | 只装"带命令行入口"的应用 |
| 安装位置 | 装进当前环境(全局 site-packages 或虚拟环境) | 每个工具装进独立的虚拟环境 |
| 依赖隔离 | 无------所有包共享同一环境 | 有------工具 A 和工具 B 的依赖互不干扰 |
| 暴露的东西 | 包 + 入口脚本,全部放进同一环境的 bin/ |
只把可执行命令软链到 ~/.local/bin,环境本身藏起来 |
pip 的痛点
pip 把所有包装进同一个环境,这个设计对库 没问题(库本来就是要被 import 到项目里用的),但对工具是灾难:
bash
pip install black
pip install some-old-tool # 依赖 click==7.0
# black 要求 click>=8,环境直接崩了
两个工具依赖同一个库的不同版本时,后装的会覆盖或破坏先装的。以前的标准解法是"每个工具手动建虚拟环境",pipx 把这套手工流程自动化了。
pipx 的做法
bash
pipx install black
这条命令背后是三步:
#mermaid-svg-kn3Wqp2ktcIyFcuo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kn3Wqp2ktcIyFcuo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kn3Wqp2ktcIyFcuo .error-icon{fill:#552222;}#mermaid-svg-kn3Wqp2ktcIyFcuo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kn3Wqp2ktcIyFcuo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kn3Wqp2ktcIyFcuo .marker.cross{stroke:#333333;}#mermaid-svg-kn3Wqp2ktcIyFcuo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kn3Wqp2ktcIyFcuo p{margin:0;}#mermaid-svg-kn3Wqp2ktcIyFcuo .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kn3Wqp2ktcIyFcuo .cluster-label text{fill:#333;}#mermaid-svg-kn3Wqp2ktcIyFcuo .cluster-label span{color:#333;}#mermaid-svg-kn3Wqp2ktcIyFcuo .cluster-label span p{background-color:transparent;}#mermaid-svg-kn3Wqp2ktcIyFcuo .label text,#mermaid-svg-kn3Wqp2ktcIyFcuo span{fill:#333;color:#333;}#mermaid-svg-kn3Wqp2ktcIyFcuo .node rect,#mermaid-svg-kn3Wqp2ktcIyFcuo .node circle,#mermaid-svg-kn3Wqp2ktcIyFcuo .node ellipse,#mermaid-svg-kn3Wqp2ktcIyFcuo .node polygon,#mermaid-svg-kn3Wqp2ktcIyFcuo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kn3Wqp2ktcIyFcuo .rough-node .label text,#mermaid-svg-kn3Wqp2ktcIyFcuo .node .label text,#mermaid-svg-kn3Wqp2ktcIyFcuo .image-shape .label,#mermaid-svg-kn3Wqp2ktcIyFcuo .icon-shape .label{text-anchor:middle;}#mermaid-svg-kn3Wqp2ktcIyFcuo .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kn3Wqp2ktcIyFcuo .rough-node .label,#mermaid-svg-kn3Wqp2ktcIyFcuo .node .label,#mermaid-svg-kn3Wqp2ktcIyFcuo .image-shape .label,#mermaid-svg-kn3Wqp2ktcIyFcuo .icon-shape .label{text-align:center;}#mermaid-svg-kn3Wqp2ktcIyFcuo .node.clickable{cursor:pointer;}#mermaid-svg-kn3Wqp2ktcIyFcuo .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kn3Wqp2ktcIyFcuo .arrowheadPath{fill:#333333;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kn3Wqp2ktcIyFcuo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kn3Wqp2ktcIyFcuo .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kn3Wqp2ktcIyFcuo .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kn3Wqp2ktcIyFcuo .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kn3Wqp2ktcIyFcuo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kn3Wqp2ktcIyFcuo .cluster text{fill:#333;}#mermaid-svg-kn3Wqp2ktcIyFcuo .cluster span{color:#333;}#mermaid-svg-kn3Wqp2ktcIyFcuo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kn3Wqp2ktcIyFcuo .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kn3Wqp2ktcIyFcuo rect.text{fill:none;stroke-width:0;}#mermaid-svg-kn3Wqp2ktcIyFcuo .icon-shape,#mermaid-svg-kn3Wqp2ktcIyFcuo .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kn3Wqp2ktcIyFcuo .icon-shape p,#mermaid-svg-kn3Wqp2ktcIyFcuo .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kn3Wqp2ktcIyFcuo .icon-shape .label rect,#mermaid-svg-kn3Wqp2ktcIyFcuo .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kn3Wqp2ktcIyFcuo .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kn3Wqp2ktcIyFcuo .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kn3Wqp2ktcIyFcuo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} pipx install black
在 ~/.local/pipx/venvs/black/
建专属虚拟环境
在环境内用 pip 安装 black
(连带全部依赖)
把 black 可执行文件软链到
~/.local/bin/
- 在
~/.local/pipx/venvs/black/建一个专属虚拟环境; - 在这个环境里用 pip 安装 black(连带它全部依赖);
- 把
black可执行文件软链到~/.local/bin/,让你在任意路径都能直接敲black。
每个工具一个环境,依赖冲突在物理上就不可能发生。pipx list 可以看到所有已装工具及其环境路径,pipx upgrade black / pipx uninstall black 管理生命周期。
选择规则
text
要 import 进自己代码的 → pip(在项目虚拟环境里装)
要在终端直接敲命令的 → pipx
举几个典型的 pipx 目标:poetry、httpie、black、ruff、ansible------都是"装完就用命令"的独立工具。反过来,requests、numpy 这类库用 pipx 装没有意义:pipx 不提供可被 import 的共享环境。
uv 来了:pipx 的现代替代
Astral 出的 uv 是 Rust 写的全能 Python 工具,一个二进制同时覆盖 pip、venv、pipx、pip-tools 的功能。和 pipx 正面重叠的是它的 tool 子命令:
| pipx | uv | |
|---|---|---|
| 安装工具 | pipx install black |
uv tool install black |
| 一次性运行(不安装) | pipx run ruff check . |
uvx ruff check . |
| 工具环境 | 每工具一个 venv(~/.local/pipx/venvs/) |
每工具一个 venv(~/.local/share/uv/tools/) |
| 依赖解析 | 调 pip,串行下载 | 自带解析器,并行下载 + 全局缓存 |
| 能力范围 | 只管命令行工具 | 还管项目依赖、venv、Python 版本切换(uv python install) |
理念完全一样------每工具一个隔离环境、只暴露命令------所以 uv tool install 可以无缝替换 pipx install。差别在工程实现:uv 的包缓存是全局共享的,五个工具都依赖 click 时只存一份,安装速度比 pipx 快一个数量级;而且 uv 不止管工具,装好之后 uv pip、uv venv、uv python 也能顺手把 pip 和 venv 的活接了。
选哪个:新机器/新项目直接上 uv,一个工具解决所有事;已有 pipx 工作流且只装工具,pipx 继续用没有任何问题,两者装的命令可以共存。
一个容易混淆的点
pipx 并不取代 pip,它内部仍然调用 pip------它只是替你管了"每个工具一个虚拟环境"这层簿记。所以三者关系是:venv 提供隔离机制,pip 在环境内装包,pipx 自动化"建环境 + pip 安装 + 链接命令"这套流程。uv 则是把这三件事连同项目依赖管理,全部重写进了同一个 Rust 二进制。