虚拟环境:别把依赖装乱了
约 14 分钟
前两章都是「打开编辑器就写」。这一章从工程实践开始——第一个要解决的是环境。
为什么会出问题
直接 pip install 会把包装进系统全局的 Python。刚开始没事,做到第三个项目时必然撞车:
项目 A 用 numpy 1.24,项目 B 依赖的某个库要求 numpy < 1.20。
同一台电脑上,两个项目没法同时正常跑。
这叫依赖冲突。而且全局环境越装越乱,最后你不知道哪个包是哪个项目要的,也不敢删。
解法:每个项目一个独立环境。
venv:Python 自带,够用
# 在项目目录里创建(.venv 是约定俗成的名字)
python3 -m venv .venv
# 激活
source .venv/bin/activate # macOS / Linux
.venv\Scripts\activate # Windows
# 激活后命令行前面会出现 (.venv)
pip install numpy pandas
# 退出
deactivate
激活之后,pip install 只装到这个目录里,和系统 Python 完全隔离。
判断有没有激活成功:
which python # 应该指向 .venv/bin/python
记录依赖:让别人能复现
pip freeze > requirements.txt # 导出当前环境的所有包和版本
pip install -r requirements.txt # 在别的机器上还原
requirements.txt 应该提交到 git,.venv/ 目录绝对不要提交——它有几百 MB,而且换台机器就不能用了。
.gitignore 里加一行:
.venv/
__pycache__/
*.pyc
一个更好的习惯:区分「直接依赖」和「全部依赖」
pip freeze 会把所有间接依赖也列出来,几十上百行,看不出你真正需要什么。
更清晰的做法:手写一份只含直接依赖的文件
# requirements.txt
numpy>=1.24
pandas>=2.0
matplotlib
版本怎么写:
| 写法 | 含义 | 建议 |
|---|---|---|
numpy |
任意版本 | 太松,别人装到新版可能跑不了 |
numpy==1.24.3 |
锁死 | 太紧,容易和别的包冲突 |
numpy>=1.24 |
最低版本 | 日常开发推荐 |
numpy>=1.24,<2.0 |
区间 | 已知大版本不兼容时用 |
其他工具(了解即可)
| 工具 | 特点 |
|---|---|
| conda | 能装非 Python 依赖(CUDA、编译库),做深度学习时常用 |
| uv | 新一代,速度极快,兼容 pip |
| poetry / pdm | 依赖解析更严谨,适合正式项目 |
给初学者的建议:先用 venv 把习惯建立起来。 工具会换,「一个项目一个环境」这个原则不会变。
一个常见的坑:Jupyter 用的不是你以为的环境
在虚拟环境里装了包,Jupyter 里 import 却报错——因为 Jupyter 内核指向的是另一个 Python。
解决:
pip install ipykernel
python -m ipykernel install --user --name=myproject
然后在 Jupyter 里选择这个内核。
练习:给你之前写过的任意一个 Python 脚本建一个虚拟环境,装上它需要的包,导出 requirements.txt,然后 deactivate 再重新激活验证一遍。
为什么每个项目要建独立虚拟环境?requirements.txt 和 .venv/ 哪个该提交到 git?
登录 后可看答案