跳到主要内容

Python 虚拟环境管理

虚拟环境是 Python 项目管理的基础,它为每个项目创建独立的 Python 运行环境,避免依赖冲突。本章将深入介绍虚拟环境的原理和各种管理工具。

为什么需要虚拟环境?​

依赖冲突问题​

假设你有两个项目:

  • 项目 A 需要 requests==2.28.0
  • 项目 B 需要 requests==2.31.0

如果在系统全局安装,两个项目会相互冲突。虚拟环境解决了这个问题,每个项目可以有自己独立的依赖版本。

虚拟环境的核心作用​

  1. 依赖隔离:每个项目有独立的包安装目录
  2. 版本管理:不同项目可以使用同一包的不同版本
  3. 环境可复现:可以精确记录和重建项目依赖
  4. 系统保护:避免污染系统 Python 环境

venv 模块(标准库)​

venv 是 Python 3.3+ 内置的虚拟环境模块,轻量且无需额外安装。

创建虚拟环境​

python -m venv .venv

这会在当前目录创建 .venv 文件夹,包含:

.venv/
├── bin/ # Linux/macOS
│ ├── activate # 激活脚本
│ ├── python # Python 解释器(符号链接)
│ └── pip # pip(符号链接)
├── Scripts/ # Windows
│ ├── activate.bat
│ ├── Activate.ps1
│ ├── python.exe
│ └── pip.exe
├── lib/
│ └── python3.x/
│ └── site-packages/ # 安装的包
└── pyvenv.cfg # 配置文件

激活虚拟环境​

# Linux/macOS (bash/zsh)
source .venv/bin/activate

# Linux/macOS (fish)
source .venv/bin/activate.fish

# Linux/macOS (csh/tcsh)
source .venv/bin/activate.csh

# Windows (cmd)
.venv\Scripts\activate.bat

# Windows (PowerShell)
.venv\Scripts\Activate.ps1

激活后,命令行提示符会显示环境名称:

(.venv) $ python --version

解释:激活脚本会修改 PATH 环境变量,将虚拟环境的 bin 目录放在最前面,这样 python 和 pip 命令就会使用虚拟环境中的版本。

退出虚拟环境​

deactivate

venv 常用选项​

python -m venv [选项] 环境目录

--system-site-packages # 允许访问系统 site-packages
--copies # 复制文件而非符号链接(Windows 默认)
--symlinks # 使用符号链接(Unix 默认)
--clear # 清除现有环境目录内容
--upgrade # 升级环境到当前 Python 版本
--without-pip # 不安装 pip
--prompt PROMPT # 自定义提示符前缀
--upgrade-deps # 升级 pip 到最新版本

示例:

python -m venv .venv --prompt myproject
python -m venv .venv --system-site-packages

不激活直接使用​

虚拟环境激活不是必须的,可以直接使用完整路径:

.venv/bin/python script.py
.venv/bin/pip install requests

这种方式适合脚本和自动化场景。

检测是否在虚拟环境中​

import sys

def in_virtualenv():
return sys.prefix != sys.base_prefix

if in_virtualenv():
print(f"当前在虚拟环境中: {sys.prefix}")
else:
print("不在虚拟环境中")

解释:

  • sys.prefix:当前 Python 环境的根目录
  • sys.base_prefix:基础 Python 安装目录
  • 在虚拟环境中,两者不同

pip 包管理​

安装包​

pip install requests              # 安装最新版
pip install requests==2.28.0 # 安装指定版本
pip install requests>=2.28.0 # 安装最低版本
pip install "requests>=2.28,<3.0" # 版本范围
pip install -e ./my-package # 可编辑模式安装
pip install git+https://github.com/user/repo.git # 从 Git 安装

管理依赖​

pip list                    # 列出已安装的包
pip list --outdated # 列出过时的包
pip show requests # 显示包详情
pip freeze # 导出依赖列表
pip freeze > requirements.txt

pip install -r requirements.txt # 从文件安装
pip install -r requirements.txt --upgrade # 升级所有依赖

requirements.txt 最佳实践​

# requirements.txt

# 生产依赖
requests==2.31.0
flask==3.0.0
sqlalchemy==2.0.23

# 使用环境标记
pywin32==306; sys_platform == 'win32'

分离开发和生产依赖:

# requirements.txt(生产)
requests==2.31.0
flask==3.0.0

# requirements-dev.txt(开发)
-r requirements.txt
pytest==7.4.0
black==23.0.0
mypy==1.7.0

现代依赖管理工具​

Poetry​

Poetry 是现代化的 Python 依赖管理工具,提供完整的项目管理功能。

安装​

pip install poetry

初始化项目​

poetry new myproject
cd myproject

或为现有项目初始化:

poetry init

pyproject.toml 配置​

[tool.poetry]
name = "myproject"
version = "0.1.0"
description = "A sample project"
authors = ["Your Name <[email protected]>"]

[tool.poetry.dependencies]
python = "^3.10"
requests = "^2.31.0"
flask = "^3.0.0"

[tool.poetry.group.dev.dependencies]
pytest = "^7.4.0"
black = "^23.0.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

常用命令​

poetry install              # 安装所有依赖
poetry install --only main # 只安装生产依赖
poetry add requests # 添加依赖
poetry add pytest --group dev # 添加开发依赖
poetry remove requests # 移除依赖
poetry update # 更新所有依赖
poetry show # 显示依赖树
poetry show --tree # 显示依赖树结构
poetry shell # 激活虚拟环境
poetry run python app.py # 在虚拟环境中运行命令
poetry build # 构建分发包
poetry publish # 发布到 PyPI

解释:Poetry 自动创建和管理虚拟环境,无需手动激活。poetry.lock 文件锁定精确版本,确保可复现性。

pipenv​

Pipenv 结合了 pip 和 virtualenv 的功能。

pip install pipenv

pipenv install # 创建环境并安装依赖
pipenv install requests # 安装包
pipenv install pytest --dev # 安装开发依赖
pipenv shell # 激活环境
pipenv run python app.py # 运行命令
pipenv graph # 显示依赖树
pipenv lock # 生成 Pipfile.lock

Pipfile 示例:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "*"
flask = ">=3.0.0"

[dev-packages]
pytest = "*"

[requires]
python_version = "3.11"

uv(新一代工具)​

uv 是用 Rust 编写的超快 Python 包管理器。

pip install uv

uv venv # 创建虚拟环境
uv pip install requests # 安装包(比 pip 快 10-100 倍)
uv pip install -r requirements.txt
uv pip sync requirements.txt # 精确同步依赖

Conda(科学计算首选)​

Conda 是 Anaconda/Miniconda 提供的跨语言包管理器,特别适合数据科学项目。

安装​

推荐安装 Miniconda(精简版):

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh

环境管理​

conda create -n myproject python=3.11  # 创建环境
conda create -n ml python=3.11 numpy pandas scikit-learn # 创建并安装包

conda activate myproject # 激活环境
conda deactivate # 退出环境

conda env list # 列出所有环境
conda env remove -n myproject # 删除环境

conda env export > environment.yml # 导出环境
conda env create -f environment.yml # 从文件创建环境

包管理​

conda install numpy        # 安装包
conda install -c conda-forge pandas # 从指定频道安装
conda update numpy # 更新包
conda remove numpy # 移除包
conda list # 列出已安装的包
conda search numpy # 搜索包

environment.yml 示例​

name: myproject
channels:
- conda-forge
- defaults
dependencies:
- python=3.11
- numpy=1.26
- pandas=2.1
- pip
- pip:
- requests==2.31.0

工具选择建议​

场景推荐工具理由
简单项目venv + pip内置工具,无需额外安装
应用开发Poetry完整的项目管理,依赖锁定
数据科学Conda支持 C 扩展库,预编译包
快速安装uv极快的安装速度
团队协作Poetry统一的开发体验

最佳实践​

1. 环境目录命名​

.venv/     # 推荐:隐藏目录,不影响项目结构
venv/ # 常见:非隐藏目录
env/ # 另一种常见命名

2. Git 忽略​

.venv/
venv/
env/
*.pyc
__pycache__/

3. 项目结构​

myproject/
├── .venv/ # 虚拟环境(不提交)
├── src/
│ └── myproject/
│ └── __init__.py
├── tests/
├── pyproject.toml # 项目配置
├── poetry.lock # 依赖锁定(提交)
└── README.md

4. 版本锁定​

生产环境必须锁定精确版本:

requests==2.31.0
flask==3.0.0

而非:

requests>=2.31.0
flask>=3.0.0

5. 使用 pyproject.toml​

现代 Python 项目推荐使用 pyproject.toml 作为统一配置文件:

[project]
name = "myproject"
version = "0.1.0"
requires-python = ">=3.10"
dependencies = [
"requests>=2.31.0",
"flask>=3.0.0",
]

[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=23.0.0",
]

[project.scripts]
myapp = "myproject.main:main"

安装:

pip install -e .           # 安装项目(可编辑模式)
pip install -e ".[dev]" # 安装项目及开发依赖

小结​

本章我们学习了:

  1. 虚拟环境的作用和原理
  2. venv 模块的使用方法
  3. pip 包管理技巧
  4. Poetry 现代依赖管理
  5. Conda 科学计算环境
  6. 各种工具的选择建议
  7. 最佳实践

练习​

  1. 使用 venv 创建一个虚拟环境并安装 requests
  2. 使用 Poetry 创建一个新项目并管理依赖
  3. 使用 Conda 创建一个数据科学环境
  4. 编写 requirements.txt 和 requirements-dev.txt

延伸阅读​