venv在深度学习中失效,因其无法指定Python版本且不管理CUDA等二进制依赖;conda create -n可创建含独立解释器、库路径及CUDA工具链的真正隔离环境。

直接用 conda 创建环境,别碰 venv ——它管不了 PyTorch 的 CUDA 二进制依赖,也锁不住 Python 解释器版本。
为什么 venv 在深度学习项目里基本失效
venv 只复制或链接系统已有的 Python 解释器,无法指定或隔离 Python 版本本身。你系统装的是 Python 3.11,venv 创建的所有环境都只能是 3.11;但更关键的是,它完全不处理 torch、torchaudio 这类包背后的 cudatoolkit、libcudnn 或 openblas 等非 Python 依赖。安装时看似成功,运行时却报 ImportError: libcudnn.so.8: cannot open shared object file 或 undefined symbol: omp_get_num_procs,就是典型症状。
这些错误不是代码问题,而是环境没真正隔离。
-
venv+pip install torch会从 PyPI 下载预编译 wheel,但 wheel 仅声明了 Python 版本兼容性,不校验 CUDA 驱动是否匹配 - 同一台机器上多个
venv共享系统级动态库路径,LD_LIBRARY_PATH一变,全崩 - 无法回滚到某个确定的
pytorch==1.13.1+cu117组合——pip freeze不记录 CUDA 工具链版本
conda create -n 是唯一靠谱的起点
用 Miniconda 启动,执行:conda create -n dl-env python=3.11。这一步就划清了边界:新环境有自己独立的 python 可执行文件、site-packages、bin/ 下所有工具,以及隐式绑定的 lib/ 路径。
立即学习“Python免费学习笔记(深入)”;
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
后续安装必须走 conda install,尤其对 PyTorch:
- 用
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia,而非pip install torch——前者由 Conda SAT 求解器统一协调 CUDA runtime、驱动 ABI、Python 扩展 ABI - 避免混用
pip和conda安装同一生态的包(比如先conda install numpy,再pip install pandas),容易触发numpyABI 不兼容 - 确认安装源顺序:
-c pytorch必须在-c nvidia前,否则可能拉到旧版cudatoolkit
验证环境是否真干净
激活后别急着跑模型,先做三件事:
- 检查 Python 路径:
which python应输出类似$CONDA_PREFIX/envs/dl-env/bin/python,不是/usr/bin/python - 确认 CUDA 可见性:
python -c "import torch; print(torch.cuda.is_available(), torch.version.cuda)"——若返回False或None,说明pytorch-cuda没装对,不是驱动问题 - 查动态库绑定:
ldd $(python -c "import torch; print(torch.__file__)") | grep cuda,应看到指向envs/dl-env/lib/libcudart.so.x.y,而非系统路径
多项目切换时最易忽略的细节
Conda 环境不是“启动一次就永远安全”。常见翻车点:
- VS Code 没手动选解释器:右下角点击 Python 版本,选
dl-env对应的路径,否则调试器仍跑在 base 环境 - Jupyter kernel 没注册:激活
dl-env后执行python -m ipykernel install --user --name dl-env --display-name "Python (dl-env)",再重启 Jupyter - 误在 base 环境下执行
pip install:哪怕只装一个requests,也可能污染base的pip行为,间接影响其他环境的pip升级逻辑
真正干净的环境,是连 pip list 输出里都看不到任何与当前项目无关的 AI 框架——包括 tensorflow、jax、甚至 onnxruntime,除非你明确需要它们共存。

















