上周有个刚学 Python 的朋友找我,说代码在自己电脑上跑得好好的,发给同事就报错。我让他把代码发过来一看,第一行就是 import pandas,版本还是 1.3.0。但他同事电脑上装的是 2.0,API 完全变了,一行代码都跑不通。
这种问题太常见了,根源就一个:所有项目共用同一个 Python 环境,依赖版本迟早冲突。
你装了项目 A 需要 pandas 1.3,又装了项目 B 需要 pandas 2.0,Python 只能有一个 pandas,怎么办?
虚拟环境是什么
一句话:给每个项目创建一个独立的 Python 环境,互不干扰。
它本质上就是一个文件夹,里面有:
你可以把它理解成给每个项目开了一个沙盒,装什么库都不影响别人。
怎么用
Python 自带 venv 模块,不用装任何东西。
# 创建虚拟环境(在项目根目录执行)python -m venv venv# 激活(Windows)venv\Scripts\activate# 激活(Mac/Linux)source venv/bin/activate
激活后,命令行前面会出现 (venv) 标识。
这时候你用 pip 装的任何东西,都只装在这个虚拟环境里,不会污染系统 Python。
# 激活后正常装包pip install pandas==2.0pip install requests# 冻结依赖(生成 requirements.txt)pip freeze > requirements.txt
别人拿到你的代码后,只需要:
python -m venv venvsource venv/bin/activate # Windows 用 venv\Scripts\activatepip install -r requirements.txt
一键复现你的环境,版本完全一致。
设计思想
虚拟环境的核心就两个字:隔离。
Python 官方在 3.3 把 venv 放进标准库,就是承认了一个事实:全局装包是灾难。
不同项目对同一个库有不同版本需求,全局环境根本管不过来。
venv 的设计哲学是够用就行。
它不管理 Python 版本(那是 pyenv 的事),不处理依赖冲突解析(那是 poetry 的事),只做一件事:给你一个干净的隔离环境。
对于大部分项目,这就够了。
你不需要一上来就装 poetry 或 conda,先把 venv 用熟。
常见问题
激活了虚拟环境,pip install 还是装到全局?
检查一下你是不是没激活,激活后用 which pip(Mac/Linux)或 where pip(Windows)确认路径指向的是 venv 目录。
venv 文件夹要不要提交到Git?
不要。
在 .gitignore 里加一行 venv/。
虚拟环境很大,而且每台电脑的系统不同,提交上去别人也用不了,只需要提交 requirements.txt 就行。
Mac/Linux 和 Windows激活命令不一样?
对。
Mac/Linux 是 source venv/bin/activate
Windows 是 venv\Scripts\activate。
deactivate 命令都一样,直接输入 deactivate 就退出虚拟环境。
每次装了新包都要重新 freeze 吗?
是的。
requirements.txt 是你手动导出的快照,不会自动更新。
每次 pip install 新东西后,跑一遍 pip freeze > requirements.txt 保持同步。
下一篇预告
依赖管理不只是 freeze 一下就完了。
pip freeze 导出的列表有一大堆你根本用不着的间接依赖,版本锁定太死也不好维护。下一篇聊聊依赖管理的正确姿势,以及 poetry 是怎么解决这些问题的。
我是鲁叶的Python,10年互联网古法程序员。
Python/ML/DL/大模型都折腾过,坑也踩了不少。
关注我,持续输出实用干货。