刚开始用Python写项目时,我习惯直接pip install各种包,直到有一天同时开发两个项目时彻底翻车——项目A需要Django 2.2,项目B需要Django 3.0,但Python的包安装目录只能存在一个版本。这种"依赖地狱"(Dependency Hell)问题,正是虚拟环境要解决的核心痛点。
虚拟环境就像给你的每个项目准备独立的工具箱。假设你同时做木工和电工:
venv的工作原理。venv模块基础使用在项目目录下执行(以Windows为例):
bash复制python -m venv myenv
这行命令会:
myenv文件夹Scripts/(Windows)或bin/(Linux/Mac)包含Python解释器副本Lib/存放独立安装的第三方包pyvenv.cfg配置文件注意:Linux/Mac用户可能需要先安装
python3-venv包
不同系统的激活方式:
| 系统 | 激活命令 | 退出命令 |
|---|---|---|
| Windows | myenv\Scripts\activate.bat |
deactivate |
| Linux/Mac | source myenv/bin/activate |
deactivate |
激活后命令行前缀会显示(myenv),提示当前处于虚拟环境。
bash复制python -m venv [OPTIONS] DEST_DIR
| 参数 | 英文全称 | 作用说明 |
|---|---|---|
--system-site-packages |
System Site Packages | 允许虚拟环境访问全局site-packages中的包(慎用,可能引发依赖冲突) |
--symlinks |
Use symlinks | 在支持符号链接的系统上优先使用符号链接而非拷贝文件(节省空间) |
--copies |
Use copies | 强制使用文件拷贝而非符号链接(某些共享主机需要) |
--clear |
Clear existing directory | 若目标目录已存在,先清空目录再创建 |
| 参数组合 | 典型使用场景 |
|---|---|
--prompt PROJECT |
自定义命令行前缀显示,如--prompt WEBAPP会显示(WEBAPP)而非目录名 |
--upgrade |
升级虚拟环境中的pip/setuptools版本(适用于已有虚拟环境) |
--without-pip |
不安装pip(极特殊情况使用,如需要绝对最小化环境) |
规范的Python项目通常这样组织:
code复制project_root/
│── .gitignore
│── requirements.txt
│── src/
│ └── your_code.py
└── venv/ # 虚拟环境目录(建议加入.gitignore)
经验:永远不要把
venv文件夹提交到Git!应该在.gitignore中加入:code复制/venv/
pip freeze > requirements.txt生成依赖清单pip install -r requirements.txtrequirements-dev.txt)Q1:虚拟环境激活后python命令无效
Scripts目录是否在PATH中chmod +x bin/activateQ2:跨平台兼容性问题
python -m pip替代直接pip命令Q3:虚拟环境占用空间过大
--symlinks参数(需系统支持)__pycache__和.cache目录| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
venv |
Python内置,无需安装 | 功能相对基础 | 简单项目,Python 3.3+ |
virtualenv |
支持Python 2/3,功能更丰富 | 需要额外安装 | 需要兼容旧版本 |
conda |
支持非Python依赖 | 体积庞大 | 科学计算场景 |
pipenv |
整合了依赖管理 | 性能较差 | 复杂项目依赖管理 |
通过pyvenv.cfg文件可以深度配置:
ini复制home = /usr/bin
include-system-site-packages = false
version = 3.8.5
可以修改:
prompt:更改命令行前缀显示include-system-site-packages:运行时切换是否包含全局包--symlinks减少文件拷贝(约快30%)bash复制python -m venv --clear --without-pip lean_venv
bash复制python -m venv --system-site-packages shared_venv
创建带依赖安装的自动化脚本setup_env.sh:
bash复制#!/bin/bash
# 创建环境
python -m venv --prompt MYPROJECT venv
source venv/bin/activate
# 安装依赖
pip install -U pip
pip install -r requirements.txt
echo "环境准备完成!"
记得给执行权限:chmod +x setup_env.sh
当激活虚拟环境时,实际发生了:
sys.prefix指向虚拟环境目录bin(或Scripts)加入PATH首位site-packages可以通过以下命令验证:
python复制import sys
print(sys.prefix) # 显示当前Python环境路径
print(sys.path) # 显示模块搜索路径
配合pyenv使用可以实现更灵活的版本控制:
bash复制# 安装特定Python版本
pyenv install 3.9.7
# 创建对应虚拟环境
pyenv local 3.9.7
python -m venv py39_venv
这种组合特别适合需要测试不同Python版本兼容性的场景。