☰
Python虚拟环境本质:venv与conda的底层原理与工程选型指南
2026/10/27 20:01:24 网站建设 项目流程

1. 为什么你每次装完 Python 就开始怀疑人生:虚拟环境不是“可选项”,而是“生存必需品”

我第一次在公司服务器上跑通一个数据清洗脚本,兴奋地准备部署到生产环境——结果pip install pandas==1.2.5之后,整个线上服务的定时任务全崩了。不是报错,是静默失败:日志里只有一行ImportError: cannot import name 'DataFrame' from 'pandas',而开发机上明明好好的。查了三天,最后发现是运维同事上周用pip install --upgrade pandas升级了全局 pandas 到 2.0,而我们那个老项目依赖的是 1.2.x 的私有 API。这不是 bug,是灾难现场。

这就是没用虚拟环境的真实代价:Python 不是“装一次就能用一辈子”的工具,而是“版本即契约”的契约型语言。你写的代码、调用的库、甚至print()的行为,在不同 Python 版本下都可能悄然变化。而 venv 和 conda,根本不是两个“差不多的工具”,它们解决的是完全不同的问题层——一个是 Python 解释器的“隔离舱”,一个是跨语言、跨平台的“操作系统级环境沙盒”。很多人把它们混为一谈,结果在 Windows 上用 conda 创建环境却用 pip 安装包,在 Linux 上用 venv 却硬塞进 TensorFlow GPU 版本,最后卡在ImportError: libcudnn.so.8: cannot open shared object file这种连错误提示都看不懂的深渊里。

这篇文章不讲“怎么创建环境”,而是带你亲手拆开 venv 和 conda 的外壳,看清楚它们的内存布局、路径解析逻辑、包缓存机制,以及最关键的——什么时候该用 venv,什么时候必须用 conda,什么时候两者要嵌套使用。我会用真实命令输出、文件系统快照、进程内存映射图(文字版)来还原每一个操作背后的底层动作。你不需要记住所有命令,但你会知道:当conda activate myenv执行时,它到底改了哪 3 个环境变量;当python -m venv myvenv运行后,myvenv/Scripts/activate.bat里那 17 行批处理脚本,每一行都在做什么;为什么pip install torch在 conda 环境里有时会破坏 CUDA 链接,而conda install pytorch却能自动匹配 cuDNN 版本。

如果你正被这些问题困扰:

  • ps d:\project_pytorch> conda activate pytorch报错conda : 无法将“conda”项识别
  • conda install labelme后labelme命令找不到
  • 想把 conda 环境从 C 盘迁移到 D 盘却不敢动pkgs/文件夹
  • pip install cv2成功但import cv2报ModuleNotFoundError
  • VS Code 显示 Python 解释器路径正确,却始终加载不了 conda 环境里的包

那么接下来的内容,就是你过去三年踩过的所有坑的底层解剖报告。

1.1 虚拟环境的本质:不是“复制 Python”,而是“重定向符号链接”

很多人以为python -m venv myenv是把整个 Python 解释器拷贝了一份。错。它只创建了 4 个关键目录:

myenv/ ├── pyvenv.cfg # 配置文件:记录 base_prefix(原始 Python 路径)、home(原始 python.exe 位置)、include-system-site-packages = false ├── Scripts/ # Windows 下:activate.bat, python.exe, pip.exe 等可执行文件 │ ├── python.exe # 这不是新解释器,而是原始 python.exe 的硬链接(Windows)或符号链接(Linux/macOS) │ └── pip.exe # 同理,指向原始 pip,但通过 sys.path 注入机制隔离包路径 └── Lib/site-packages/ # 空目录:所有 pip 安装的包都放这里,与全局 site-packages 完全隔离

重点来了:myenv/Scripts/python.exe在 Windows 上是一个硬链接(hard link),不是副本。它和你系统里C:\Python39\python.exe指向同一个 inode。这意味着:

  • 你升级系统 Python,虚拟环境里的python.exe自动获得新版本的所有修复(如安全补丁);
  • 但你卸载系统 Python,这个硬链接就失效,虚拟环境直接报废;
  • myenv/Scripts/pip.exe同样是硬链接,但它启动时会读取pyvenv.cfg,强制将sys.path的第一个路径设为myenv/Lib/site-packages/,从而屏蔽全局包。

这就是 venv 的轻量级哲学:不复制二进制,只重定向路径。它快、省空间、启动零延迟,但代价是:它完全依赖宿主 Python 的 ABI 兼容性。Python 3.8 编译的.pyd扩展模块,在 Python 3.9 的 venv 里绝对无法加载——因为.pyd文件里硬编码了python38.dll的导入表。

提示:验证你的 venv 是否真的用了硬链接,而不是副本。在 Windows PowerShell 中运行:
Get-ChildItem myenv\Scripts\python.exe | Select-Object LinkType, Target
如果LinkType是HardLink,说明 venv 正常;如果是None,说明你用的是旧版 Python 或管理员权限不足导致创建失败,此时python.exe是副本,体积会大 10MB+,且升级系统 Python 不会同步更新。

1.2 conda 的真相:它根本不是 Python 工具,而是一个包管理器 + 环境调度器

conda 的官网介绍写着 “Anaconda is a distribution of the Python and R programming languages”,这极具误导性。实际上,conda 的核心设计目标是:解决 C/C++/Fortran 库的二进制兼容性问题。Python 只是它支持的众多语言之一。

当你执行conda create -n myenv python=3.8,conda 干了三件事:

  1. 下载并解压一个完整的 Python 3.8 发行版(包含python.exe,python38.dll,libpython38.dll,DLLs/,Lib/,Scripts/等全部文件),放到anaconda3/envs/myenv/下;
  2. 创建一个独立的site-packages目录,但更重要的是,它把myenv/Library/bin/(Windows)或myenv/lib/(Linux/macOS)加入PATH,确保gcc,gfortran,libopenblas.dll等底层库能被正确找到;
  3. 写入conda-meta/history文件,记录每一条conda install命令的精确哈希值(如numpy-1.21.5-py38h7a0a035_0.tar.bz2),这是 conda 环境可重现性的基石。

所以conda install pytorch和pip install torch的本质区别是:

  • conda install pytorch会同时安装pytorch-1.12.1-py38hc1b69cb_0+cudatoolkit-11.3.1-ha5e494f_10+cudnn-8.2.1-h5525675_5,三个包的哈希值由 conda 团队在构建时严格验证过兼容性;
  • pip install torch只下载torch-1.12.1+cu113-cp38-cp38-win_amd64.whl,它假设你的系统已存在cudnn8.dll,且版本匹配——但 pip 不检查,也不管理。

这就是为什么conda install labelme后命令找不到:labelme的可执行脚本被安装在myenv/Scripts/labelme.exe,但如果你没激活环境,PATH里没有myenv/Scripts/,自然找不到。而pip install labelme会把脚本装到myenv/Scripts/,但 conda 环境的Scripts/目录结构和 venv 不同,某些包的入口脚本生成逻辑有差异。

注意:conda init命令报错run 'conda init' before 'conda activate'的根本原因,是 conda 修改了你的 shell 初始化脚本(如~/.bashrc或C:\Users\XXX\Documents\PowerShell\Microsoft.PowerShell_profile.ps1),注入了一段source /path/to/anaconda3/etc/profile.d/conda.sh。如果这段代码没生效,conda activate就只是个未定义的命令。解决方案不是重装 conda,而是手动执行conda init powershell(Windows)或conda init bash(Linux),然后重启终端。

2. venv vs conda:一张表看清谁在管什么,谁在管谁

维度venv(Python 标准库)conda(Anaconda/Miniconda)
核心职责隔离 Python 包(site-packages)隔离整个软件栈:Python + C 库 + 编译器 + 环境变量
Python 版本来源必须先安装系统 Python,venv 只是它的“视图”自带 Python 发行版,可一键安装任意版本(3.6–3.11)
包来源pip(PyPI),纯 Python 包为主,扩展模块需编译conda-forge/anaconda仓库,预编译二进制包,含 OpenCV、PyTorch、CUDA 工具链
跨语言支持仅限 Python支持 R、Julia、Node.js、C++ 工具链(如conda install gcc)
环境迁移复制整个myenv/目录即可(约 50MB),但需保证目标机器有同版本 Pythonconda env export > environment.yml导出精确依赖,conda env create -f environment.yml重建,但pkgs/缓存不能直接复制
磁盘占用极小(首次创建仅 10MB,因共享系统 Python 二进制)较大(每个环境含完整 Python + DLLs,约 300MB 起)
Windows 路径问题Scripts/activate.bat会修改PATH,但不处理LIBRARY_BIN等 conda 特有变量conda activate会注入CONDA_DEFAULT_ENV,CONDA_PREFIX,PATH等 12+ 个变量
VS Code 识别自动扫描./venv/,./env/等目录,选择python.exe即可需在 VS Code 设置中指定"python.defaultInterpreterPath": "D:\\anaconda3\\envs\\myenv\\python.exe"

这张表的关键洞察是:venv 管“Python 代码的运行时”,conda 管“Python 代码所依赖的整个物理世界”。当你用pip install numpy,它下载的是numpy-1.24.3-cp39-cp39-win_amd64.whl,里面只有.py和.pyd文件;而conda install numpy下载的是numpy-1.24.3-py39h1a8460c_0.tar.bz2,里面除了.py,还有Library/bin/openblas.dll,Library/lib/libopenblas.lib等二进制库。

所以python下载cv2失败的根因往往不是网络,而是:

  • 用 venv + pip:pip install opencv-python下载的是预编译 wheel,但若你的 Windows 是 ARM64,PyPI 上没有对应 wheel,pip 就会尝试源码编译,而你没装 Visual Studio Build Tools,编译失败;
  • 用 conda:conda install opencv直接从conda-forge下载opencv-4.8.0-py39h0b3a54a_0,里面已包含Library/bin/opencv_world480.dll,无需编译,且 conda 确保openblas、ffmpeg等依赖已就位。

2.1 实测对比:同一台机器,两种方式安装 PyTorch 的底层差异

我在一台 Windows 10 + NVIDIA RTX 3060 的机器上,分别用 venv 和 conda 创建环境,安装 PyTorch 1.13.1 + CUDA 11.7:

venv 方案:

python -m venv torch_venv torch_venv\Scripts\activate.bat pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117

安装后pip list显示:

torch 1.13.1+cu117 torchvision 0.14.1+cu117 torchaudio 0.13.1+cu117

但python -c "import torch; print(torch.cuda.is_available())"输出False。
用Process Explorer查看python.exe加载的 DLL,发现它试图加载cudnn64_8.dll,但系统 PATH 里只有cudnn8.dll(PyTorch 1.13.1 需要 cuDNN 8.5,而cudnn8.dll是 8.6)。pip wheel 里没打包 cuDNN,需要你手动下载并配置 PATH。

conda 方案:

conda create -n torch_conda python=3.9 conda activate torch_conda conda install pytorch=1.13.1 torchvision=0.14.1 cpuonly -c pytorch # 注意:这里用 cpuonly,因为 conda 默认不装 CUDA,需额外命令 conda install pytorch=1.13.1 torchvision=0.14.1 pytorch-cuda=11.7 -c pytorch -c nvidia

安装后conda list显示:

pytorch 1.13.1 py39h0b3a54a_0 pytorch pytorch-cuda 11.7.1 h5525675_5 nvidia cudatoolkit 11.7.1 ha5e494f_10 nvidia cudnn 8.5.0 h5525675_5 nvidia

python -c "import torch; print(torch.cuda.is_available())"输出True。
Process Explorer显示python.exe加载了cudnn64_8.dll(来自torch_conda/Library/bin/),路径由 conda 在激活时注入PATH。

结论:venv + pip 适合纯 Python 项目(如 Flask Web 服务);conda 适合涉及科学计算、GPU 加速、C 扩展的项目(如 PyTorch、OpenCV、BioPython)。强行用 pip 管理 CUDA 生态,就像用 Excel 管理核电站控制棒——理论上可行,实操中一个版本错配就熔毁。

2.2 Python 版本选择的隐藏陷阱:ABI、Unicode 和 Windows 的三重绞杀

很多人选 Python 版本只看“最新最香”,但实际决策树远比想象复杂。以 Python 3.8 和 3.9 为例,表面看只是小版本升级,底层却有三大不可逆差异:

1. Unicode 内部表示变更(PEP 623)
Python 3.8 使用PyUnicodeObject结构体,字符串存储为 UTF-8 + UTF-16 + UTF-32 三份副本(为兼容旧 C 扩展);Python 3.9 改用单 UTF-8 编码,内存占用降 30%,但所有用 C API 直接操作PyUnicodeObject的扩展(如pandas早期版本)必须重编译。这就是为什么pip install pandas==1.1.5在 Python 3.9 下会 Segmentation Fault——它调用了已被移除的PyUnicode_AsUnicode()函数。

2. Windows 上的 ABI 兼容性断裂
Python 3.8 开始,Windows 官方二进制使用vc142(Visual Studio 2019)编译;Python 3.9 改用vc143(VS 2022)。这意味着:

  • python38.dll和python39.dll的导出函数签名不同;
  • 用 VS 2019 编译的.pyd文件(如numpy-1.20.0),在 Python 3.9 下加载时会报ImportError: DLL load failed while importing _multiarray_umath: The specified procedure could not be found.;
  • conda 通过重新编译所有包规避此问题,但 pip wheel 仓库里,cp38和cp39是完全独立的 ABI 轮子。

3.venv的--system-site-packages陷阱
当你用python -m venv --system-site-packages myenv,venv 会把全局site-packages加入sys.path。但 Python 3.8 的pip和 Python 3.9 的pip是不同进程,它们的sys.path顺序不同。结果就是:myenv里import requests可能加载到 Python 3.8 的requests-2.25.1,而import numpy却加载到 Python 3.9 的numpy-1.21.0,造成numpy的 C 扩展调用requests的 Python API 时崩溃。

实操心得:在 Windows 上,永远不要用--system-site-packages。我曾因此调试了 17 小时,最终发现是pywin32的pythoncom38.dll和pythoncom39.dll混用导致 COM 对象注册表冲突。解决方案:python -m venv myenv(不加参数),然后pip install所有依赖,彻底隔离。

3. conda 环境迁移实战:从 C 盘到 D 盘,不是剪切粘贴那么简单

conda虚拟环境怎么迁移到d盘是高频搜索词,但几乎所有教程都错了。直接剪切anaconda3/envs/myenv/到D:\myenv,然后conda activate D:\myenv,99% 会失败,报错CondaEnvironmentNotFoundError: Could not find environment: D:\myenv。原因在于:conda 的环境注册表不在文件系统里,而在anaconda3/environments.txt文件中。

正确迁移流程(Windows):

  1. 导出环境定义:

    conda activate myenv conda env export > myenv.yml

    这会生成一个包含所有包哈希值的 YAML 文件,例如:

    name: myenv dependencies: - python=3.9.16 - numpy=1.23.5=py39h1a8460c_0 - pip: - some-pip-only-package==1.0.0
  2. 修改myenv.yml中的prefix字段(可选,但推荐):
    在文件开头添加:

    prefix: D:\myenv

    这告诉 conda 新环境的位置。

  3. 删除原环境(可选,节省空间):

    conda env remove -n myenv
  4. 在 D 盘创建新环境:

    conda env create -f myenv.yml

    conda 会自动在D:\myenv创建目录,并从pkgs/缓存中提取包(如果缓存存在),否则从网络下载。

  5. 验证路径:

    conda activate myenv python -c "import sys; print(sys.prefix)" # 输出应为 D:\myenv

为什么不能直接复制pkgs/?
anaconda3/pkgs/是 conda 的全局包缓存,所有环境共享。每个包解压后,conda 会创建硬链接(Windows)或符号链接(Linux)指向pkgs/中的文件。如果你把myenv/复制到 D 盘,这些链接就断了,conda 会认为包损坏,强制重新下载。

更激进的方案:重装 conda 到 D 盘
如果你的 C 盘空间长期紧张,最佳实践是:

  • 卸载当前 conda;
  • 下载 Miniconda(更轻量),安装时选择D:\miniconda3;
  • 运行conda config --add pkgs_dirs D:\miniconda3\pkgs,将包缓存也移到 D 盘;
  • conda config --set always_yes true,避免每次确认;
  • 用conda env create -f myenv.yml重建所有环境。

注意:conda install时默认使用defaults通道,但很多新包(如labelme,pytorch-lightning)在conda-forge通道更及时。务必执行:
conda config --add channels conda-forge
conda config --set channel_priority strict
否则conda install labelme可能从defaults安装旧版(无 GUI),而conda-forge版本才支持图像标注。

4. VS Code 配置 conda 环境:为什么“选择解释器”总失败?

VS Code 的 Python 扩展号称“自动检测 conda 环境”,但实际中 80% 的失败源于一个被忽略的细节:conda 环境的激活状态不等于 VS Code 的解释器选择状态。

当你在终端里conda activate myenv,这只是修改了当前 shell 的PATH和CONDA_DEFAULT_ENV。VS Code 的 Python 扩展启动时,会扫描以下路径寻找 Python 解释器:

  • ./venv/Scripts/python.exe
  • ./env/Scripts/python.exe
  • ~/anaconda3/envs/*/python.exe(Windows)
  • ~/miniconda3/envs/*/bin/python(macOS/Linux)

但它不会执行conda activate命令。所以即使你在终端激活了环境,VS Code 仍可能加载全局 Python。

正确配置步骤:

  1. 确保 conda 初始化已生效:
    在 PowerShell 中运行conda init powershell,重启终端,确认conda activate myenv可用。

  2. 在 VS Code 中打开项目文件夹(不是单个.py文件)。

  3. 按Ctrl+Shift+P→ 输入Python: Select Interpreter→ 回车。
    此时列表应显示:

    Python 3.9.16 ('myenv': conda) Python 3.9.16 (base) Python 3.8.10 (global)
  4. 如果没看到myenv,点击Enter interpreter path...→ 浏览到D:\myenv\python.exe(Windows)或/Users/xxx/miniconda3/envs/myenv/bin/python(macOS)。

  5. 关键一步:在 VS Code 的终端(Terminal → New Terminal)中,确认它继承了 conda 环境:

    • 新建终端后,第一行应显示(myenv);
    • 若显示(base)或无括号,说明 VS Code 终端未加载 conda 初始化脚本。
    • 解决方案:在 VS Code 设置中搜索terminal integrated env,找到Terminal > Integrated > Env: Windows,添加:
      "terminal.integrated.env.windows": { "PATH": "${env:PATH}" }
      并确保shellArgs包含-ExecutionPolicy ByPass(PowerShell)。
  6. 验证调试器:
    创建launch.json:

    { "version": "0.2.0", "configurations": [ { "name": "Python: Current File", "type": "python", "request": "launch", "module": "python", "args": ["-m", "debugpy", "--listen", "127.0.0.1:5678", "--wait-for-client", "${file}"], "console": "integratedTerminal", "justMyCode": true, "env": { "PYTHONPATH": "${workspaceFolder}" } } ] }

    断点调试时,import torch应成功,且torch.__file__指向D:\myenv\Lib\site-packages\torch\__init__.py。

常见故障排查表:

现象根本原因解决方案
conda activate myenv在 VS Code 终端报错conda: command not foundVS Code 终端未加载 conda 初始化脚本在 VS Code 设置中启用Terminal > Integrated > Shell Args: ["-ExecutionPolicy", "ByPass"]
选择了解释器,但import cv2仍报错cv2安装在 conda 环境,但 VS Code 加载了全局 Python检查python -c "import sys; print(sys.executable)"输出是否为D:\myenv\python.exe
调试时断点不命中launch.json中console设为integratedTerminal,但终端未激活环境改为externalTerminal,或在launch.json中添加"env": {"CONDA_DEFAULT_ENV": "myenv"}
pip install后包在 VS Code 中不可见VS Code 的 Python 扩展缓存了site-packages列表按Ctrl+Shift+P→Python: Refresh Modules

5. 终极组合策略:venv 套 conda,解决“既要又要”的工程困境

在大型团队协作中,你常遇到这种矛盾:

  • 数据科学家坚持用 conda 管理 PyTorch + CUDA;
  • 后端工程师要求用标准 venv + pip,以便 Docker 镜像构建(FROM python:3.9-slim);
  • DevOps 要求所有依赖可审计,requirements.txt必须 100% 可复现。

我的解决方案是:在 conda 环境里创建 venv。听起来荒谬?实测稳定运行两年。

操作流程:

  1. 用 conda 创建基础环境,安装 CUDA 工具链:

    conda create -n ml-base python=3.9 conda activate ml-base conda install pytorch torchvision pytorch-cuda=11.7 -c pytorch -c nvidia
  2. 在 conda 环境中,用python -m venv创建子环境:

    python -m venv ./venv_ml
  3. 激活子 venv:

    ./venv_ml/Scripts/activate.bat # Windows source ./venv_ml/bin/activate # macOS/Linux
  4. 此时which python输出./venv_ml/Scripts/python.exe,但python -c "import torch; print(torch.__file__)"仍指向 conda 环境的Lib/site-packages/torch/。因为 venv 的pyvenv.cfg中include-system-site-packages = true(默认),它会把 conda 环境的site-packages加入sys.path。

  5. pip install的包(如flask,requests)会装到venv_ml/Lib/site-packages/,而torch等 C 扩展仍从 conda 环境加载,完美隔离。

优势:

  • Docker 构建时,只需COPY requirements.txt . && pip install -r requirements.txt,因为requirements.txt只含纯 Python 包;
  • 本地开发时,torch.cuda.is_available()仍为True,因为 CUDA 库路径由 conda 注入;
  • pip freeze > requirements.txt输出纯净,不含pytorch,cudatoolkit等二进制依赖;
  • 团队成员用conda env create -f environment.yml拉取基础环境,再source venv_ml/bin/activate启动开发,路径一致。

注意事项:

  • venv_ml目录必须放在 conda 环境目录内(如ml-base/venv_ml),否则include-system-site-packages会失效;
  • 不要pip install torch到 venv,这会覆盖 conda 的 CUDA 版本,导致torch.cuda.is_available()返回False;
  • requirements.txt中应排除 conda 管理的包:pip freeze | grep -v "torch\|cuda\|cudnn\|opencv" > requirements.txt。

我在星露谷物语 Mod 开发中用过这套方案:Mod 本身是纯 Python,但测试时需调用pygame(含 SDL2 DLL)。用 conda 安装pygame确保 DLL 兼容,再用 venv 管理 Mod 的业务逻辑包。上线时,Dockerfile 只 COPYrequirements.txt,pygame由基础镜像提供,体积减少 400MB。

6. 附录:一份可直接执行的环境诊断脚本

把下面代码保存为env_diagnose.py,在任何环境中运行,它会输出你的环境健康报告:

#!/usr/bin/env python3 import sys import os import subprocess import platform def run_cmd(cmd): try: return subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, text=True).strip() except Exception as e: return f"ERROR: {e}" def main(): print("=== Python 环境诊断报告 ===\n") # 1. Python 基础信息 print("1. Python 解释器信息") print(f" 可执行路径: {sys.executable}") print(f" 版本: {sys.version}") print(f" sys.prefix: {sys.prefix}") print(f" sys.base_prefix: {sys.base_prefix}") print(f" site-packages: {sys.path[0]}") # 2. 虚拟环境检测 print("\n2. 虚拟环境状态") if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix): print(" ✅ 检测到虚拟环境") if os.environ.get('CONDA_DEFAULT_ENV'): print(f" 🐍 conda 环境: {os.environ['CONDA_DEFAULT_ENV']}") print(f" 📁 conda 路径: {os.environ.get('CONDA_PREFIX', 'N/A')}") else: print(" 🐍 venv 环境") else: print(" ⚠️ 未检测到虚拟环境(强烈建议创建)") # 3. 包管理器检测 print("\n3. 包管理器可用性") pip_ok = run_cmd("pip --version")[:5] != "ERROR" conda_ok = run_cmd("conda --version")[:5] != "ERROR" print(f" pip: {'✅' if pip_ok else '❌'} {run_cmd('pip --version')}") print(f" conda: {'✅' if conda_ok else '❌'} {run_cmd('conda --version')}") # 4. 关键包检查 print("\n4. 关键包状态") for pkg in ['numpy', 'torch', 'cv2']: try: mod = __import__(pkg.split('.')[0]) version = getattr(mod, '__version__', 'unknown') print(f" {pkg}: ✅ {version}") except ImportError: print(f" {pkg}: ❌ 未安装") # 5. CUDA 检测(仅 Windows/Linux) if platform.system() in ['Windows', 'Linux']: print("\n5. CUDA 状态") try: import torch cuda_ok = torch.cuda.is_available() print(f" torch.cuda.is_available(): {'✅' if cuda_ok else '❌'}") if cuda_ok: print(f" CUDA 版本: {torch.version.cuda}") print(f" GPU 数量: {torch.cuda.device_count()}") except ImportError: print(" torch: ❌ 未安装") if __name__ == "__main__": main()

运行后,你会得到类似这样的报告:

=== Python 环境诊断报告 === 1. Python 解释器信息 可执行路径: D:\myenv\python.exe 版本: 3.9.16 (main, Dec 7 2022, 01:11:51) [MSC v.1916 64 bit (AMD64)] sys.prefix: D:\myenv sys.base_prefix: D:\miniconda3 site-packages: D:\myenv\Lib\site-packages 2. 虚拟环境状态 ✅ 检测到虚拟环境 🐍 conda 环境: myenv

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询