1/什么是 venv?
venv 是 Python 内置的虚拟环境管理模块(Python 3.3+ 版本自带),用于创建独立的 Python 环境。
每个虚拟环境都有自己的:
- Python 解释器
- pip 包管理器
- 独立安装的第三方包
- 环境变量设置
2/为什么需要 venv?
- 项目隔离:不同项目可以使用不同版本的包
- 避免冲突:防止包版本冲突
- 权限管理:不需要系统管理员权限安装包
- 环境复制:轻松复制项目环境
3/基本使用步骤
<1>创建虚拟环境
# 基本创建命令
python -m venv myenv_test1
# 指定 Python 版本(如果有多个版本)
python3.9 -m venv myenv_test1
python3.10 -m venv myenv_test1
# 指定完整路径
python -m venv /path/to/myenv
<2>激活虚拟环境
Windows (CMD/PowerShell):
# CMD
myenv_test1\Scripts\activate.bat
# PowerShell
myenv_test1Scripts\Activate.ps1
# 如果出现执行策略错误,先运行:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Mac/Linux (Bash/Zsh):
source myenv_test1/bin/activate
激活成功后,命令行提示符会显示虚拟环境名称:
(myenv_test1) user@hostname ~ $
<3>在虚拟环境中操作
# 检查 Python 位置(应指向虚拟环境)
which python
# 或 Windows: where python
# 检查 pip 位置 (应指向虚拟环境)
which pip
# 安装包(只影响当前虚拟环境, 前提是: 你得先进入该虚拟环境)
pip install numpy pandas
# 查看已安装的包
pip list
# 生成 requirements.txt
pip freeze > requirements.txt
<4>退出虚拟环境
deactivate # 前提是: 你当前在这个环境中
4/高级创建选项
<1>创建时指定选项
# 1. 包含系统全局包(通常不推荐)
python -m venv --system-site-packages myenv
# 2. 使用符号链接而不是复制文件(节省空间)
python -m venv --symlinks myenv
# 3. 不使用符号链接(默认在Windows上)
python -m venv --copies myenv
# 4. 升级 pip、setuptools、wheel
python -m venv --upgrade-deps myenv
# 5. 指定 Python 解释器路径
python -m venv --python=/usr/bin/python3.9 myenv
# 6. 组合多个选项
python -m venv --system-site-packages --upgrade-deps myenv
<2>快速创建脚本
创建一个 create_venv.sh(Mac/Linux)或 create_venv.ps1(Windows):
Mac/Linux:
#!/bin/bash
python -m venv myenv_test1
source myenv_test1/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
echo "虚拟环境已创建并激活"
Windows PowerShell:
python -m venv myenv_test1
myenv_test1\Scripts\Activate.ps1
pip install --upgrade pip
if (Test-Path requirements.txt) {
pip install -r requirements.txt
}
Write-Host "虚拟环境已创建并激活" -ForegroundColor Green
5/虚拟环境结构
创建后的虚拟环境的目录结构:
myenv_test1/
├── bin/ # Mac/Linux: 可执行文件
│ ├── python # Python 解释器
│ ├── pip # pip 包管理器
│ └── activate # 激活脚本
├── Scripts/ # Windows: 可执行文件
│ ├── python.exe
│ ├── pip.exe
│ └── activate.bat
├── lib/ # 安装的包
│ └── python3.x/
│ └── site-packages/
├── include/ # C/C++ 头文件
└── pyvenv.cfg # 配置文件
6/虚拟环境配置文件 (pyvenv.cfg)
pyvenv.cfg 文件内容示例:
home = /usr/local/bin
include-system-site-packages = false
version = 3.9.5
7/项目管理实践
<1>项目结构推荐
my_project/
├── venv/ # 虚拟环境(.gitignore 忽略)
├── .gitignore # 版本控制忽略文件
├── requirements.txt # 依赖列表
├── requirements-dev.txt # 开发依赖
├── src/ # 源代码
│ └── app.py
└── README.md
<2>.gitignore 配置
# 虚拟环境
venv/
env/
.myenv/
# Python 缓存文件
__pycache__/
*.py[cod]
*$py.class
<3>依赖管理
# 保存依赖
pip freeze > requirements.txt
# 从文件安装依赖
pip install -r requirements.txt
# 开发依赖和生产依赖分开
# requirements.txt - 生产环境
# requirements-dev.txt - 开发环境(测试工具、代码检查等)
# 安装开发依赖
pip install -r requirements-dev.txt
8/常见问题解决
<1>"command not found: python" 错误
# 使用 python3 代替 python
python3 -m venv myenv
source myenv/bin/activate
<2>**权限问题
# 确保对目录有读写权限
chmod -R 755 myenv
# 或完全删除后重新创建
rm -rf myenv
python -m venv myenv
<3>虚拟环境无法激活
检查激活脚本是否存在:
ls -la myenv/bin/activate # Mac/Linux
dir myenv\Scripts\Activate.ps1 # Windows
<4>跨平台兼容性
创建跨平台兼容的虚拟环境:
# 使用相对路径
python -m venv ./venv
# 在脚本中检测操作系统
if [ "$OSTYPE" = "msys" ] || [ "$OSTYPE" = "cygwin" ]; then
# Windows
source venv/Scripts/activate
else
# Mac/Linux
source venv/bin/activate
fi
9/IDE 集成
<1>VS Code
- 打开项目文件夹
- 选择解释器:
Ctrl+Shift+P→ "Python: Select Interpreter" - 选择虚拟环境中的 Python 路径
<2>PyCharm
- File → Settings → Project → Python Interpreter
- 点击齿轮图标 → Add
- 选择 "Existing environment"
- 浏览到虚拟环境的 Python 解释器
10/自动化脚本示例
setup_project.py:
#!/usr/bin/env python3
import os
import subprocess
import sys
def create_virtual_env(env_name="venv"):
"""创建虚拟环境"""
print(f"创建虚拟环境: {env_name}")
# 检查是否已存在
if os.path.exists(env_name):
print(f"警告: {env_name} 已存在")
response = input("是否删除并重新创建? (y/n): ")
if response.lower() == 'y':
import shutil
shutil.rmtree(env_name)
else:
return
# 创建虚拟环境
subprocess.run([sys.executable, "-m", "venv", env_name])
# 激活并安装基础包
if os.name == 'nt': # Windows
pip_path = os.path.join(env_name, "Scripts", "pip")
else: # Mac/Linux
pip_path = os.path.join(env_name, "bin", "pip")
# 升级 pip
subprocess.run([pip_path, "install", "--upgrade", "pip"])
print(f"虚拟环境 {env_name} 创建成功")
if __name__ == "__main__":
create_virtual_env()
11/最佳实践总结
- 每个项目单独使用虚拟环境
- 虚拟环境目录名通常用
venv或.venv - 不要将虚拟环境提交到版本控制
- 使用
requirements.txt管理依赖 - 在运行项目前总是激活虚拟环境
- 定期更新虚拟环境中的包
- 为生产环境创建干净的虚拟环境
通过使用 venv,你可以确保 Python 项目的依赖管理和环境隔离,这是现代 Python 开发的基础技能。