Java的Maven/Gradle vs Python的包管理
Java程序员习惯了Maven/Gradle——一个pom.xml管所有依赖。Python的包管理曾经是一团糟(pip/venv/setuptools/setup.py混战),但从2024年开始,uv的出现彻底改变了局面。
一、pip基础(Java程序员必知)
# 安装包(类似Maven的dependency)
pip install requests
pip install flask==2.3.0 # 指定版本(类似Maven的version标签)
pip install flask>=2.0,<3.0 # 版本范围
# 查看已安装
pip list
pip show flask # 查看包详情(类似mvn dependency:tree)
# 导出依赖(类似pom.xml)
pip freeze > requirements.txt
从文件安装
pip install -r requirements.txt
卸载
pip uninstall flask
requirements.txt vs pom.xml
# requirements.txt(pip格式)
flask==2.3.0
requests>=2.28.0
pandas~=1.5.0 # 兼容版本(>=1.5.0, <1.6.0)
```
```xml
org.springframework
spring-boot
3.1.0
pip的弱点: 没有Maven那样的传递依赖管理和冲突解决。两个包依赖同一个包的不同版本,pip可能直接装最新的,不保证兼容。
二、虚拟环境:Python版的module system
为什么需要虚拟环境?
项目A: flask 2.0 + requests 2.28
项目B: flask 2.3 + requests 2.31
不用虚拟环境,两个项目的依赖会混在一起,版本冲突是家常便饭。虚拟环境让每个项目有独立的Python包空间。
venv:标准库自带
# 创建虚拟环境(在项目目录下)
python -m venv .venv
激活
source .venv/bin/activate # Linux/Mac
.venv\Scripts\activate # Windows
激活后,pip install只影响这个环境
pip install flask # 装到.venv里,不影响系统Python
查看当前Python路径(应该是.venv里的)
which python # /home/user/project/.venv/bin/python
退出虚拟环境
deactivate
pyenv:管理Python版本
# 安装pyenv
curl https://pyenv.run | bash # 注意:生产环境建议先检查脚本
或者用包管理器安装(更安全)
sudo apt install pyenv # Ubuntu
brew install pyenv # Mac
安装Python 3.12
pyenv install 3.12.0
pyenv global 3.12.0 # 全局默认版本
pyenv local 3.11.0 # 项目级版本(写入.python-version文件)
查看已安装版本
pyenv versions
三、uv:2026年最推荐的方案
uv是Astral开发的Rust工具,整合了pip、venv、pyenv的功能,速度快10-100倍。
# 安装uv
curl -LsSf https://astral.sh/uv/install.sh | sh
或者
pip install uv
创建项目(自动创建虚拟环境+pyproject.toml)
uv init myproject
cd myproject
添加依赖(自动更新pyproject.toml和uv.lock)
uv add flask requests
uv add --dev pytest black mypy
同步依赖(从lock文件安装,类似npm ci)
uv sync
运行
uv run python main.py
uv run pytest
管理Python版本
uv python install 3.12
uv python pin 3.12
uv vs pip vs poetry
| 特性 | pip | poetry | uv |
|---|---|---|---|
| 项目脚手架 | 无 | poetry new | uv init |
四、pyproject.toml:现代Python的pom.xml
# pyproject.toml(PEP 621标准)
[project]
name = "myproject"
version = "0.1.0"
description = "我的项目"
readme = "README.md"
requires-python = ">=3.11"
dependencies = [
"flask>=3.0",
"requests>=2.31",
"pydantic>=2.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0",
"black>=23.0",
"mypy>=1.0",
]
[tool.black]
line-length = 88
target-version = ["py312"]
[tool.mypy]
python_version = "3.12"
strict = true
对比pom.xml: pyproject.toml是TOML格式,比XML简洁,而且被pip、poetry、uv、hatch等所有工具支持。
五、pipx:CLI工具隔离安装
# 安装pipx
pip install pipx
用pipx安装CLI工具(不污染全局环境)
pipx install black
pipx install poetry
pipx install ruff
升级
pipx upgrade black
列出已安装
pipx list
Java类比: pipx就像把mvn、gradle装到独立目录,不和项目依赖混在一起。
六、editable install:开发必备
# 开发模式安装(代码改了立刻生效,不需要重新安装)
pip install -e .
或者用uv
uv pip install -e .
场景: 你有一个本地包mylib,在src/mylib/下写代码。用-e .安装后,改了mylib的代码不需要重新pip install,直接生效。
七、项目结构最佳实践
myproject/
├── pyproject.toml # 项目配置(取代setup.py + requirements.txt)
├── uv.lock # 依赖锁定(或poetry.lock)
├── README.md
├── .python-version # Python版本(pyenv/uv读取)
├── src/
│ └── myproject/
│ ├── __init__.py
│ ├── main.py
│ ├── models/
│ │ ├── __init__.py
│ │ └── user.py
│ └── utils/
│ ├── __init__.py
│ └── helpers.py
├── tests/
│ ├── __init__.py
│ └── test_main.py
├── .gitignore
└── .pre-commit-config.yaml # pre-commit hooks
八、常用工具对比
| 功能 | Python工具 | Java工具 |
|---|---|---|
| CLI工具隔离 | pipx | SDKMAN |
总结
Python的包管理已经从"一团糟"进化到了现代化阶段。uv是2026年的最佳选择,一个工具搞定一切。如果项目用不了uv,pip+venv+pyproject.toml也足够了。
下一篇聊并发编程——多线程、协程和asyncio。
本系列持续更新中,关注不迷路。