Python 虚拟环境:venv、conda 与 Python 版本选择全解
系列第 3 篇。上一篇我们把 PyTorch 装上并确认了 GPU 可用(或正准备装),接下来马上会撞上新的墙:"为什么同一个命令在同事电脑上能跑,我这边就报
ModuleNotFoundError?""怎么装了一个新包,老项目反而跑不起来了?" 根源几乎都是同一件事------没有环境隔离。本篇把 Python 版本选择、venv、conda 一次讲清,外加国内 pip 加速与环境污染定位法。Python 环境、conda 环境、venv 这三组词是本地部署 AI 绕不开的地基,值得读两遍。

一、为什么需要它:不隔离的代价
Python 的包体系默认把所有包装进同一个"公共仓库"(site-packages)。两个项目一旦版本要求不同,就会打架。我见过很多次这样的场景:
项目 A(Ollama 前端对接)要求 transformers 4.38;项目 B(一段老 Stable Diffusion 脚本)写死了 transformers 4.25。都装在全局的话:装 4.38,B 崩;降回 4.25,A 起不来。你就在"降版本修 A、升版本修 B"的循环里反复横跳------这就是依赖地狱。越修越乱,最后的结局往往是把 Python 卸载重装,前功尽弃。
为什么 AI 方向比普通 Web 项目更容易掉进依赖地狱?两点:一是依赖重,PyTorch 的 wheel 自带 CUDA 运行时,装完一个环境就有几个 GB;二是依赖脆,PyTorch 与 cuXXX 版 wheel、各模型库对 transformers 等公共包的要求互相咬合成一张约束网,动一处牵全身。普通脚本装错重装一下就行,AI 项目装错要重新下几个 GB 的包,环境管理的成本被放大了一个量级。
虚拟环境的思路只有一条:每个项目一个独立"仓库" ,各有自己的 site-packages,环境内 pip install 只影响本环境。同一台机器上,4.38 和 4.25 可以并存,互不干扰。
为什么 AI 本地部署尤其要隔离?因为这个方向的版本耦合更严:PyTorch 与 cuXXX 版 wheel 咬合、各模型库对 transformers、tokenizers、xformers 等公共包的要求又各不相同。隔离做不好,后面每一篇(Ollama、ComfyUI、vLLM)的报错都会变难排查 10 倍。
二、环境要求
| 项目 | 要求 | 说明 |
|---|---|---|
| 操作系统 | Windows 10/11(64 位)或 Ubuntu 20.04+ | 32 位 Python 直接排除,主流 AI 包基本不提供 32 位 wheel |
| Python 版本 | 3.10 / 3.11 / 3.12 | 3.11 保守、3.12 可用、3.13 有兼容风险 |
| 磁盘 | 空环境只有几十 MB | 装上 PyTorch 和模型库后,单环境通常到 GB 级 |
| 网络 | 国内网络配清华/阿里 pip 镜像 | 见"五、进阶技巧" |
| 前置 | 已完成《AI-01 CUDA与N卡驱动安装》 | 装 PyTorch 前先确认 nvidia-smi 能出表 |
Python 版本怎么选:3.11 为什么是保守选择
- 3.11:AI 生态里 wheel 覆盖最全的版本,老科研包兼容最好。本系列默认推荐 3.11。
- 3.12:主流框架(PyTorch、vLLM 等)都已支持,日常可用;但部分老包的兼容性仍在陆续完善,装到"装不上"时优先降到 3.11 试试。
- 3.13:较新,生态还在追赶,C 扩展类包和老科学计算库可能直接编译失败,生产用途别当小白鼠。
如果项目明确写了要 3.10 或其他版本:要么在 Windows 上单独安装那个版本(python.org 官方安装器),要么直接用 conda 建对应版本的环境------后者不用在系统里堆多个 Python,是我更常用的做法。
一句话原则:项目文档写了版本就照文档;没写就选 3.11。 像 vLLM 这类对版本有明确区间的框架,装之前先翻一眼官方文档(详见《AI-13 vLLM高吞吐推理引擎》)。
三、安装与部署
3.1 venv 全流程(首选)
venv 是 Python 3.3+ 的标准库模块,不用额外安装。全流程 5 步:
第 1 步:创建环境。在项目目录下执行:
bash
python -m venv .venv
会生成一个 .venv 目录,里面有独立的解释器副本和独立的 site-packages。Linux 上如果创建失败并提示 ensurepip 相关错误,先装系统自带的 venv 支持包再试(写法见 Python 官方 venv 文档)。
第 2 步:激活环境。
- Windows(PowerShell / CMD):
powershell
.venv\Scripts\activate
- Linux / WSL:
bash
source .venv/bin/activate
激活成功的标志:命令行提示符前多出一个 (.venv) 前缀。我一般只看这个前缀判断"人在不在环境里"。小提醒:个别 PowerShell 配置下执行 activate 会报脚本运行错误,那是 PowerShell 的执行策略拦截,与 Python 本身无关,处理办法见 Python 官方 venv 文档,或改用 CMD(激活不受此限制)。
第 3 步:安装依赖。激活后装包,例如 PyTorch(以官网选择器生成的命令为准,cu124 为例):
bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
第 4 步:停用环境。用完执行:
bash
deactivate
前缀消失即回到全局。注意:关掉终端窗口也会自动停用,这不是异常。
第 5 步:删除环境 。直接把 .venv 目录整个删掉即可,没有"卸载"一说。C 盘紧张时,删除不再用的旧环境是最快的腾空间手段------一个装过 PyTorch 的环境轻松几个 GB。
3.2 conda 流程
conda 需要额外安装(轻量版 Miniconda,从 Anaconda 官方渠道下载安装程序即可)。装好后:
bash
conda create -n ai python=3.11 -y
conda activate ai
激活后提示符前缀变成 (ai)。conda 与 venv 最本质的区别:conda 连 Python 解释器本身也能管理------同一台机器上可以建一个 3.11 环境、一个 3.10 环境,随时切换;而 venv 只能基于系统里已有的 Python 版本"克隆",不能给环境单独换 Python 版本。两者存放位置也不同:venv 环境就在项目目录里的 .venv 目录,跟着项目走,删掉目录等于环境消失;conda 环境统一存放在安装目录里,适合在一台机器上集中管理多个环境。我的习惯:项目级隔离用 venv,机器级多 Python 版本管理用 conda。
四、验证
环境是否"干净",三条命令确认:
bash
python -V
where python
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
预期结果:
python -V输出3.11.x(或你选的版本);where python(Windows;Linux 用which python)的第一行 指向.venv\Scripts\python.exe------如果指向全局目录(如C:\Python311),说明环境没激活或激活错了;- 第三条输出
2.x.x+cu124 True。如果是False,九成是装成了 CPU 版 PyTorch,处理办法详见《AI-02 PyTorch安装与验证》。
这三条命令对应三层:版本 → 解释器路径 → 框架与 GPU 的联动,正好覆盖排错分层定位法里的环境层与框架层。"逐层确认"的习惯是排错效率的根本------先确认问题在哪一层,再想怎么修,而不是盲目重装。
五、进阶技巧
-
国内 pip 镜像加速 。任何
pip install后面加-i参数:bashpip install <pkg> -i https://pypi.tuna.tsinghua.edu.cn/simple阿里源同理:
https://mirrors.aliyun.com/pypi/simple。长期项目建议把镜像写进 pip 配置文件,一次配置全局生效(配置写法以 pip 官方文档为准)。注意:PyTorch 的 cuXXX 版走--index-url指向 PyTorch 官方源,两者不要混用。 -
venv 还是 conda:默认 venv,两种情况上 conda 。venv 轻量、标准库自带、建删都快,纯 pip 能装齐的项目(Ollama 周边、vLLM、diffusers 类)都用 venv。遇到这两种情况换 conda:① 同一台机器要多个 Python 版本 (一个项目 3.10、另一个 3.12);② 老科研包需要特定 C 库或编译依赖,conda 可以连非 Python 依赖一起装,省心很多。
-
三个环境污染禁忌 。① 在全局 Python 里直接
pip install(永远先激活环境再装包);② 多个 Python 混用------机器上同时装了 3.11 和 3.13 时,装包前看一眼where python,别装错解释器;③ 用 32 位 Python 跑 AI------很多包根本没有 32 位 wheel,import 时直接 DLL 加载失败,而且 32 位进程的内存寻址上限会直接卡死大模型场景。 -
清理不用的环境腾磁盘 。venv 环境把
.venv目录删掉即可;conda 环境有对应的删除命令(语法见 conda 官方文档),删掉后对应的环境目录一并释放。每个实验都装一遍 PyTorch 的话,磁盘一定会被塞满------C 盘紧张时,删掉一个旧环境能腾出几个 GB。
六、故障排查
环境类问题用分层定位法:先判断报错落在网络层 / 驱动层 / 框架层 / 环境层 / 依赖层哪一层,再对症。按层排序如下:
| # | 症状(报错原文) | 层 | 原因 | 解决 |
|---|---|---|---|---|
| 1 | HuggingFace 下载卡住 / ConnectionError / 超时 |
网络层 | 国内访问 huggingface.co 受限 | 环境变量 HF_ENDPOINT=https://hf-mirror.com 或改用 ModelScope |
| 2 | CUDA driver version is insufficient for CUDA runtime version |
驱动层 | 驱动低于框架所需 CUDA 版本 | 升级 NVIDIA 驱动(不是只升 Toolkit),见《AI-01 CUDA与N卡驱动安装》 |
| 3 | torch.cuda.is_available() 返回 False |
框架层 | PyTorch 装了 CPU 版;或驱动过老 | 重装对应 cuXXX 版 wheel;驱动过老先升级 |
| 4 | ModuleNotFoundError: No module named 'torch' |
环境层 | 激活了错误环境 / 全局 vs venv | which python / where python 确认解释器路径,重新激活再装 |
| 5 | Error 126: Unknown error / 加载 .so/.dll 失败(libcudart.so.12 not found 类) |
环境层 | 多版本 CUDA 混装、PATH 污染 | 清理环境变量;用 conda 隔离;ldd / dumpbin 看缺哪个库 |
| 6 | ImportError: DLL load failed while importing ...(Windows) |
依赖层 | VC 运行库缺失 / 位数不匹配(32/64) | 装 VC++ 2015-2022 Redistributable x64;确保 64 位 Python |
三条实战经验:
-
第 4 条是环境层出现频率最高的报错。我的固定动作是先跑
where python再看别的------十有八九是"环境没激活"或"激活了另一个环境",重装包之前先确认解释器路径,能省一半时间。 -
第 5、6 条经常同根(32 位 Python 或多版本污染),排查顺序:确认解释器位数和路径 → 清环境变量 → 用 conda 建干净环境重装,别在旧环境里继续"打补丁"。
-
第一次遇到
ModuleNotFoundError时,按顺序想三件事:环境激活没有(看前缀)、包是不是装在了当前这个环境里(激活之后装的才算)、包名拼错没有------或者 Python 版本太新导致该包没有预编译 wheel,最后这种情况降到 3.11 通常就好了。
七、本篇自检清单
- 能说出"为什么必须虚拟环境"(版本冲突 → 依赖地狱)
- 能按项目选 Python 版本(默认 3.11,3.12 可用,3.13 谨慎)
- 完整跑过 venv 五步:创建 → 激活 → 装包 → 停用 → 删除
- 用 conda 建过独立环境并激活(多版本 Python / 老科研包场景)
- 用清华镜像成功装过一个包
- 见到
ModuleNotFoundError能先用where python/which python定位 - 机器上没有 32 位 Python 在跑 AI,也从不往全局环境乱装包
一句话收尾:版本听项目文档的,没写就 3.11;隔离默认 venv,要多版本 Python 或碰老科研包才上 conda;装包之前永远先看 where python。 做到这三条,环境层的坑能避开九成。
下一篇:《AI-04 WSL2部署AI开发环境》------在 Windows 上装一个"真 Linux",还能直通 GPU。
参考
- Python 官方文档:venv --- Virtual environments(https://docs.python.org/3/library/venv.html)
- pip 官方文档:Configuration(镜像与 index-url 配置,https://pip.pypa.io/en/stable/topics/configuration/)
- conda 官方文档:Managing environments(https://docs.anaconda.com/conda/user-guide/tasks/manage-environments/)
- 清华大学 TUNA pip 镜像:https://pypi.tuna.tsinghua.edu.cn/simple