Python 虚拟环境:venv、conda 与 Python 版本选择全解

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())"

预期结果:

  1. python -V 输出 3.11.x(或你选的版本);
  2. where python(Windows;Linux 用 which python)的第一行 指向 .venv\Scripts\python.exe------如果指向全局目录(如 C:\Python311),说明环境没激活或激活错了;
  3. 第三条输出 2.x.x+cu124 True。如果是 False,九成是装成了 CPU 版 PyTorch,处理办法详见《AI-02 PyTorch安装与验证》。

这三条命令对应三层:版本 → 解释器路径 → 框架与 GPU 的联动,正好覆盖排错分层定位法里的环境层与框架层。"逐层确认"的习惯是排错效率的根本------先确认问题在哪一层,再想怎么修,而不是盲目重装。

五、进阶技巧

  1. 国内 pip 镜像加速 。任何 pip install 后面加 -i 参数:

    bash 复制代码
    pip install <pkg> -i https://pypi.tuna.tsinghua.edu.cn/simple

    阿里源同理:https://mirrors.aliyun.com/pypi/simple。长期项目建议把镜像写进 pip 配置文件,一次配置全局生效(配置写法以 pip 官方文档为准)。注意:PyTorch 的 cuXXX 版走 --index-url 指向 PyTorch 官方源,两者不要混用。

  2. venv 还是 conda:默认 venv,两种情况上 conda 。venv 轻量、标准库自带、建删都快,纯 pip 能装齐的项目(Ollama 周边、vLLM、diffusers 类)都用 venv。遇到这两种情况换 conda:① 同一台机器要多个 Python 版本 (一个项目 3.10、另一个 3.12);② 老科研包需要特定 C 库或编译依赖,conda 可以连非 Python 依赖一起装,省心很多。

  3. 三个环境污染禁忌 。① 在全局 Python 里直接 pip install(永远先激活环境再装包);② 多个 Python 混用------机器上同时装了 3.11 和 3.13 时,装包前看一眼 where python,别装错解释器;③ 用 32 位 Python 跑 AI------很多包根本没有 32 位 wheel,import 时直接 DLL 加载失败,而且 32 位进程的内存寻址上限会直接卡死大模型场景。

  4. 清理不用的环境腾磁盘 。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。

参考

相关推荐
蒲公英eric42 分钟前
Python工具链与LaTeX排版:把兵器配齐
人工智能·python·算法·数学建模·数学建模工具
程序员老陆1 小时前
嵌入式 Qt:QWidgets 还是 QML / Qt Quick?
开发语言·qt
.道阻且长.1 小时前
C++11 :新的类功能,lambda,包装器
开发语言·c++·后端
言乐61 小时前
JavaScript概括前端原理
开发语言·前端·javascript·python·ecmascript
liulilittle1 小时前
短期内不存在通用 AI 工作流魔法
大数据·开发语言·c++·人工智能·llm·agent·tools
郝学胜-神的一滴1 小时前
C++ Templates 03:手写一个Stack看透模板核心机制
开发语言·c++·产品运营·软件工程·产品经理
用户019027581611 小时前
如何用 Python 回测肯特纳通道(Keltner Channel)突破策略?(EMA+ATR 通道)
python
(Charon)1 小时前
【C/C++面试】手写内存池:从空闲链表到内存申请与释放
java·开发语言·windows
派小心.1 小时前
页面关闭前埋点丢失:sendBeacon验收
开发语言·php