一、为什么需要
不加虚拟环境时,所有项目共用一个 site-packages:版本冲突、卸载一个包把别的项目搞挂、系统包被污染。虚拟环境给每个项目一套独立的解释器与包目录,互不影响。
二、创建与激活
# 创建(在项目根目录)
python3 -m venv .venv
# 激活
source .venv/bin/activate # macOS / Linux
.venv\Scripts\activate # Windows cmd
.venv\Scripts\Activate.ps1 # Windows PowerShell
# 退出
deactivate
激活后命令行前面会出现 (.venv),which python 指向 .venv/bin/python。这一步是判断是否激活成功的可靠方式,比看提示符靠谱。
三、装包与导出
pip install requests
pip freeze > requirements.txt
pip install -r requirements.txt
pip freeze 会导出所有已安装包(包括依赖的依赖),适合精确复现。只想记录直接依赖时,手工维护一个精简的 requirements.in,或用 pip-tools 生成锁文件。
四、.venv 不要提交到仓库
.venv/
venv/
__pycache__/
*.pyc
虚拟环境里是平台相关的二进制,提交上去既占空间又不能跨平台用。团队协作只共享 requirements.txt,各自创建环境。
五、激活失败的常见原因
| 现象 | 原因与解决 |
|---|---|
command not found: python3 | 未安装 Python 或不在 PATH |
Activate.ps1 cannot be loaded(Windows) | 执行策略限制,Set-ExecutionPolicy -Scope CurrentUser RemoteSigned |
激活了但 pip install 装到全局 | 用了 sudo pip,或激活的是另一个 shell |
python 版本不对 | 创建时用了 python3.11 -m venv,激活后应一致 |
| IDE 里不生效 | 需在 IDE 设置里指定解释器路径,不是靠 shell 激活 |
最后一条最容易忽略:VS Code / PyCharm 用自己的解释器设置,终端激活不会自动同步。
六、虚拟环境里有什么
.venv/
├── bin/ # python、pip、激活脚本
├── lib/python3.x/site-packages/
└── pyvenv.cfg # 记录基础解释器路径与版本
它不复制标准库,只创建一个指向基础解释器的链接,所以创建很快、占用很小。这也意味着不要移动或删除基础 Python,否则虚拟环境会失效。
七、venv、virtualenv、conda、pyenv 怎么选
| 工具 | 用途 |
|---|---|
venv | 标准库自带,够用,推荐默认 |
virtualenv | 更快、支持更老版本,第三方 |
conda | 管理 Python 版本 + 二进制包,数据科学常用 |
pyenv | 管理多个 Python 版本本身(不是虚拟环境) |
poetry / uv | 依赖管理 + 虚拟环境一体,现代项目常用 |
组合方式常见是「pyenv 管版本 + venv 管项目依赖」,或直接用 uv 一步到位。
八、部署时的做法
服务器上不需要「激活」,直接指定解释器路径更可靠:
/path/to/.venv/bin/python app.py
/path/to/.venv/bin/pip install -r requirements.txt
systemd 的 ExecStart 里写绝对路径,就不会有「激活没生效」的问题。
小结
python -m venv .venv 创建,source .venv/bin/activate 激活,pip freeze > requirements.txt 导出;.venv 加进 .gitignore;部署时直接用 .venv/bin/python 绝对路径。