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 干了三件事:
- 下载并解压一个完整的 Python 3.8 发行版(包含
python.exe,python38.dll,libpython38.dll,DLLs/,Lib/,Scripts/等全部文件),放到anaconda3/envs/myenv/下; - 创建一个独立的
site-packages目录,但更重要的是,它把myenv/Library/bin/(Windows)或myenv/lib/(Linux/macOS)加入PATH,确保gcc,gfortran,libopenblas.dll等底层库能被正确找到; - 写入
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),但需保证目标机器有同版本 Python | conda 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 nvidiapython -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):
导出环境定义:
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修改
myenv.yml中的prefix字段(可选,但推荐):
在文件开头添加:prefix: D:\myenv这告诉 conda 新环境的位置。
删除原环境(可选,节省空间):
conda env remove -n myenv在 D 盘创建新环境:
conda env create -f myenv.ymlconda 会自动在
D:\myenv创建目录,并从pkgs/缓存中提取包(如果缓存存在),否则从网络下载。验证路径:
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-forgeconda 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。
正确配置步骤:
确保 conda 初始化已生效:
在 PowerShell 中运行conda init powershell,重启终端,确认conda activate myenv可用。在 VS Code 中打开项目文件夹(不是单个
.py文件)。按
Ctrl+Shift+P→ 输入Python: Select Interpreter→ 回车。
此时列表应显示:Python 3.9.16 ('myenv': conda) Python 3.9.16 (base) Python 3.8.10 (global)如果没看到
myenv,点击Enter interpreter path...→ 浏览到D:\myenv\python.exe(Windows)或/Users/xxx/miniconda3/envs/myenv/bin/python(macOS)。关键一步:在 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)。
- 新建终端后,第一行应显示
验证调试器:
创建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 found | VS 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。听起来荒谬?实测稳定运行两年。
操作流程:
用 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在 conda 环境中,用
python -m venv创建子环境:python -m venv ./venv_ml激活子 venv:
./venv_ml/Scripts/activate.bat # Windows source ./venv_ml/bin/activate # macOS/Linux此时
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。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