Python 编程

虚拟环境:别把依赖装乱了

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?

登录 后可看答案