Python 虚拟环境完全指南:venv、conda、uv 怎么选

站长 2026-09-29 1 约 2 分钟 380 字
#Python#虚拟环境#venv#conda#uv

为什么需要虚拟环境

假设你同时在开发两个项目:

  • 项目 A 是去年写的,依赖 Django 3.2
  • 项目 B 是新项目,要用 Django 5.0

Python 默认把第三方包装在同一个全局目录里。装了 Django 5.0,项目 A 直接跑不起来;退回 3.2,项目 B 又报错。这就是「依赖地狱」。

虚拟环境的解决思路很直接:给每个项目造一个独立的 Python 运行空间,各装各的包,互不干扰。

电脑
├── 全局 Python 3.12
├── 项目A/venv/   ← Django 3.2
├── 项目B/venv/   ← Django 5.0
└── 项目C/venv/   ← 一堆 AI 库

方案一:venv(官方内置,默认首选)

Python 3.3+ 自带,零安装,适合 90% 的纯 Python 项目。

创建与激活:

# 在项目目录下创建虚拟环境(目录名约定俗成叫 .venv 或 venv)
python -m venv .venv

# Windows 激活
.venv\Scripts\activate

# macOS/Linux 激活
source .venv/bin/activate

激活成功的标志:命令行提示符前面出现 (.venv)。

日常使用:

# 装包(装在虚拟环境里,不污染全局)
pip install requests pandas

# 导出依赖清单(项目交接、部署时用)
pip freeze > requirements.txt

# 别人拿到项目后还原环境
pip install -r requirements.txt

# 退出虚拟环境
deactivate

优点:官方标准、零依赖、任何 Python 环境都有。

缺点:只能管理 Python 包,管不了 CUDA、MySQL 客户端这类系统级依赖;不能切换 Python 版本(venv 创建时用什么版本就是什么版本)。

方案二:conda(数据科学标配)

Anaconda/Miniconda 提供的环境管理器,不仅能管 Python 包,还能管 Python 解释器本身和非 Python 依赖。

常用命令:

# 创建环境,同时指定 Python 版本
conda create -n myproject python=3.11

# 激活 / 退出
conda activate myproject
conda deactivate

# 装包
conda install numpy pandas
# conda 仓库没有的包,可以混用 pip
pip install some-package

# 导出与还原
conda env export > environment.yml
conda env create -f environment.yml

# 查看所有环境 / 删除环境
conda env list
conda remove -n myproject --all

建议装 Miniconda 而不是 Anaconda:Anaconda 预装了几百个包,体积 3G+;Miniconda 只有核心,按需安装。

什么时候必须选 conda:需要特定版本的 CUDA/cuDNN(深度学习训练)、需要 GDAL 这类难装的地理信息库、需要在同一台机器维护多个 Python 版本。

方案三:uv(2024 年后的新王)

Astral 公司(ruff 的作者)用 Rust 写的包管理器,速度比 pip 快 10-100 倍,正在迅速成为新标准。

# 安装 uv(Windows PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

# 创建项目(自动生成 .venv、pyproject.toml)
uv init myproject
cd myproject

# 装包(秒装,第一次用会惊到)
uv add requests pandas

# 运行脚本(自动用项目环境,不用手动激活)
uv run main.py

# 锁定依赖(生成 uv.lock,保证全团队环境一致)
uv lock

uv 最大的改进是把 venv、pip、pyproject.toml、锁定文件整合成一套连贯的工作流,以前要四五个工具配合的事,现在一个命令搞定。

怎么选:一张决策表

你的情况 推荐
纯 Python 项目,图省心 venv
深度学习/数据科学,要 CUDA conda
新项目,追求速度和现代工作流 uv
团队协作、要锁定依赖版本 uv
老旧项目维护 跟着项目原来的方案走

新手建议:从 venv 学起理解原理,新项目直接上 uv,碰到 CUDA 相关的再上 conda。三者概念相通,切换成本很低。

常见坑排查清单

1. 装了包却提示 ModuleNotFoundError

90% 的原因是:包装在了 A 环境,程序却在 B 环境运行。排查:

# 看当前 python 在哪
python -c "import sys; print(sys.executable)"

# 看包装在了哪
pip show 包名 | findstr Location

两个路径对不上就是环境问题。

2. Windows 激活脚本报错「禁止运行脚本」

PowerShell 执行策略限制,管理员身份运行一次:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

3. 虚拟环境目录要不要提交 Git

不要。.venv/ 动辄几百 MB,应该加进 .gitignore,用 requirements.txt 或 uv.lock 传递依赖信息。

4. IDE 里代码飘红但命令行能跑

IDE 用的解释器和命令行不是同一个。VS Code 按 Ctrl+Shift+P → Python: Select Interpreter,选项目 .venv 里的那个。

5. requirements.txt 写成一团乱

手动维护比 pip freeze 更好——freeze 会把所有间接依赖都写进去。推荐只写直接依赖:

requests>=2.31
pandas>=2.0

写在最后

虚拟环境是 Python 工程化的第一课。养成习惯:每个新项目第一件事就是建虚拟环境。项目越多的老司机越清楚——今天你省下的 30 秒,就是明天某次神秘报错时要还的债。

评论 (0)

我的头像

还没有评论,快来抢沙发吧~