包管理和虚拟环境:告别DLL地狱

admin 📖 2 分钟阅读

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

特性pippoetryuv
项目脚手架poetry newuv init
**2026年新项目首选uv,老项目用pip也够用。**

四、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就像把mvngradle装到独立目录,不和项目依赖混在一起。

六、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工具隔离pipxSDKMAN

总结

Python的包管理已经从"一团糟"进化到了现代化阶段。uv是2026年的最佳选择,一个工具搞定一切。如果项目用不了uv,pip+venv+pyproject.toml也足够了。

下一篇聊并发编程——多线程、协程和asyncio。


本系列持续更新中,关注不迷路。

🤖 本文内容由AI辅助整理生成,仅供参考
← 上一篇 异常处理和调试:Python的try-catch长什么样? 下一篇 → 并发编程:多线程、协程和asyncio