Skip to main content

pip vs pipx - 区别详解

核心区别一句话

  • pip:安装 Python (library)
  • pipx:安装 Python 应用程序(CLI tools)

详细对比

pip(Python 自带)

用途:安装 Python 库和依赖包

# 安装库到当前环境
pip install requests
pip install numpy pandas

# 然后在代码中导入使用
import requests
import numpy as np

安装位置

  • 全局安装:系统 Python 的 site-packages
  • 虚拟环境:当前虚拟环境的 site-packages

问题: ❌ 多个工具的依赖可能冲突
❌ 污染全局 Python 环境
❌ 不同工具可能需要同一个库的不同版本

示例问题

pip install black==22.0  # 代码格式化工具
pip install flake8==6.0 # 代码检查工具

# 假设 black 需要 click==8.0
# 但 flake8 需要 click==7.0
# 冲突!💥

pipx(需要单独安装)

用途:安装带命令行的 Python 应用程序

# 安装 CLI 工具
pipx install poetry
pipx install black
pipx install httpie

# 可以直接在命令行使用
poetry --version
black --help
http GET https://api.github.com

安装位置

  • 每个应用有独立的虚拟环境
  • 命令链接到 ~/.local/bin(自动添加到 PATH)

优点: ✅ 每个工具独立隔离,没有依赖冲突
✅ 不污染全局环境
✅ 自动管理虚拟环境
✅ 可以同时安装多个版本
✅ 卸载干净,不留残留


形象比喻

pip = 安装零件

你的 Python 环境(工具箱)
├── requests(螺丝刀)
├── numpy(扳手)
├── pandas(锤子)
└── flask(钳子)

# 所有工具混在一个工具箱里

pipx = 安装独立工具

~/.local/pipx/venvs/
├── poetry/(独立工具箱 A)
│ ├── poetry 本身
│ └── poetry 的所有依赖
├── black/(独立工具箱 B)
│ ├── black 本身
│ └── black 的所有依赖
└── httpie/(独立工具箱 C)
├── httpie 本身
└── httpie 的所有依赖

# 每个工具都有自己独立的工具箱

使用场景对比

什么时候用 pip?

库/框架(要在代码中 import 的):

pip install requests      # HTTP 库
pip install numpy # 数值计算库
pip install django # Web 框架
pip install tensorflow # 机器学习框架
pip install pandas # 数据分析库

特点:需要在 Python 代码中 import 使用

什么时候用 pipx?

命令行工具(直接在终端运行的):

pipx install poetry       # 包管理工具
pipx install black # 代码格式化
pipx install flake8 # 代码检查
pipx install pytest # 测试框架
pipx install httpie # HTTP 客户端
pipx install youtube-dl # 视频下载
pipx install cookiecutter # 项目模板
pipx install jupyter # Jupyter Notebook
pipx install pylint # 代码分析
pipx install twine # PyPI 上传工具

特点:安装后直接在命令行使用,不需要 import


实际例子

场景 1:开发 Web 应用

# 项目依赖 - 用 pip
cd my-web-project
python -m venv venv
source venv/bin/activate
pip install django requests

# 开发工具 - 用 pipx
pipx install black # 格式化代码
pipx install pytest # 运行测试

场景 2:数据科学

# 数据科学库 - 用 pip
pip install numpy pandas matplotlib scikit-learn

# 开发工具 - 用 pipx
pipx install jupyter # Jupyter Notebook
pipx install ipython # 增强的 Python shell

pipx 的工作原理

1. 创建独立虚拟环境

pipx install poetry

# 实际做了什么:
# 1. 创建 ~/.local/pipx/venvs/poetry
# 2. 在该虚拟环境中 pip install poetry
# 3. 链接命令到 ~/.local/bin/poetry

2. 查看 pipx 管理的应用

# 列出所有安装的应用
pipx list

# 输出示例:
# venvs are in /Users/you/.local/pipx/venvs
# apps are exposed on your $PATH at /Users/you/.local/bin
# package poetry 1.7.0, installed using Python 3.11.0
# - poetry
# package black 23.11.0, installed using Python 3.11.0
# - black
# - blackd

3. 目录结构

~/.local/
├── bin/ # 命令链接(在 PATH 中)
│ ├── poetry -> ../pipx/venvs/poetry/bin/poetry
│ ├── black -> ../pipx/venvs/black/bin/black
│ └── httpie -> ../pipx/venvs/httpie/bin/http
└── pipx/
└── venvs/ # 独立虚拟环境
├── poetry/
│ ├── bin/
│ ├── lib/
│ └── pyvenv.cfg
├── black/
└── httpie/

pipx 常用命令

# 安装
pipx install <package>

# 安装特定版本
pipx install poetry==1.7.0

# 从 GitHub 安装
pipx install git+https://github.com/user/repo.git

# 升级
pipx upgrade <package>
pipx upgrade-all # 升级所有

# 卸载
pipx uninstall <package>

# 列出已安装
pipx list

# 运行一次性命令(不安装)
pipx run <package>
# 例如:pipx run cowsay "Hello!"

# 注入额外的包到已有环境
pipx inject poetry poetry-plugin-export

# 重新安装(环境损坏时)
pipx reinstall <package>

常见问题

Q1: 我应该用 pip 还是 pipx 安装 pytest?

答案:看情况!

用 pip(推荐):

# 在项目虚拟环境中
cd my-project
python -m venv venv
source venv/bin/activate
pip install pytest

# 这样 pytest 和项目共享依赖

用 pipx

# 想全局使用 pytest 命令
pipx install pytest

# 但这样 pytest 在独立环境中
# 可能找不到你项目的依赖

Q2: pipx 安装的工具能在虚拟环境中用吗?

可以!pipx 安装的命令在 ~/.local/bin,在 PATH 中,所以任何地方都能用:

# 在任何目录、任何虚拟环境
poetry --version # ✅ 都可以用
black --help # ✅ 都可以用

Q3: pipx install jupyter 和 pip install jupyter 有什么区别?

# pipx install jupyter
# - Jupyter 在独立环境
# - 不能访问你项目的包

# pip install jupyter(在虚拟环境)
# - Jupyter 和项目在同一环境
# - 可以 import 你项目的包
# - 更常用!

Q4: 为什么我装了 Poetry/Black 但命令找不到?

# 可能是 PATH 没配置
pipx ensurepath

# 或手动添加到 .zshrc / .bashrc
export PATH="$HOME/.local/bin:$PATH"

安装 pipx

macOS

# Homebrew
brew install pipx
pipx ensurepath

# 或用 pip
python3 -m pip install --user pipx
python3 -m pipx ensurepath

Linux

# Ubuntu/Debian
sudo apt install pipx
pipx ensurepath

# 或用 pip
python3 -m pip install --user pipx
python3 -m pipx ensurepath

Windows

# PowerShell
py -m pip install --user pipx
py -m pipx ensurepath

推荐的工具安装方式

用 pip 安装

# 项目依赖
requests, numpy, pandas, django, flask, fastapi
tensorflow, pytorch, scikit-learn
beautifulsoup4, selenium, scrapy
pillow, opencv-python, matplotlib
sqlalchemy, psycopg2, pymongo

用 pipx 安装

# 开发工具
poetry # 包管理
black # 代码格式化
flake8 # 代码检查
mypy # 类型检查
pytest # 测试(也可用 pip)
cookiecutter # 项目模板
httpie # HTTP 客户端
twine # PyPI 上传
pre-commit # Git hooks
pipenv # 虚拟环境管理(如果不用 poetry)

对比表格

特性pippipx
Python 自带✅ 是❌ 需要安装
主要用途安装库安装 CLI 工具
隔离性❌ 共享环境✅ 独立环境
依赖冲突⚠️ 可能冲突✅ 不会冲突
全局可用⚠️ 可能污染✅ 干净隔离
典型用例import requestspoetry new

最佳实践

✅ DO

  1. 项目依赖 → 用 pip 在虚拟环境中安装

    python -m venv venv
    pip install -r requirements.txt
  2. 全局工具 → 用 pipx 安装

    pipx install poetry black httpie
  3. 测试新工具 → 用 pipx run(不安装)

    pipx run cowsay "Hello!"
    pipx run pycowsay "Moo!"

❌ DON'T

  1. ❌ 用 pip 全局安装 CLI 工具

    # 不推荐
    pip install poetry # 可能和其他工具冲突
  2. ❌ 用 pipx 安装项目依赖

    # 错误
    pipx install django # 项目无法 import

总结

简单记忆法

  • import → 用 pip
  • 直接在命令行用的 → 用 pipx

例子

# 这个用 pip
import requests

# 这个用 pipx
$ poetry add requests