最近在本地复现一个开源项目时,作者提供的 environment.yml 文件让我体会到python虐我千百遍我待她如初恋的感觉。原以为一行 conda env create -f environment.yml 就能轻松搭建环境,结果却遭遇连环报错。本文将分享我的踩坑解决方案,并提供可复现的操作指南,助你绕过这些深坑!
💥 问题 1:yml 文件依赖无法识别——哈希值与路径陷阱
🛑 踩坑现象
执行conda env create -f environment.yml命令后,终端疯狂输出 ResolveNotNotFoundError
错误:
下面是我自己environment.yml文件截图。
name: s-sam
channels:
- pytorch
- nvidia
- defaults
dependencies:
- _libgcc_mutex=0.1=main
- _openmp_mutex=5.1=1_gnu
- asttokens=2.0.5=pyhd3eb1b0_0
- backcall=0.2.0=pyhd3eb1b0_0
- ca-certificates=2023.01.10=h06a4308_0
- certifi=2022.12.7=py38h06a4308_0
- comm=0.1.2=py38h06a4308_0
- cuda=11.7.1=0
- cuda-cccl=11.7.91=0
- cuda-command-line-tools=11.7.1=0
- cuda-compiler=11.7.1=0
- cuda-cudart=11.7.99=0
- cuda-cudart-dev=11.7.99=0
- cuda-cuobjdump=11.7.91=0
- cuda-cupti=11.7.101=0
- cuda-cuxxfilt=11.7.91=0
- cuda-demo-suite=12.0.76=0
- cuda-documentation=12.0.76=0
- cuda-driver-dev=11.7.99=0
- cuda-gdb=12.0.90=0
- cuda-libraries=11.7.1=0
- cuda-libraries-dev=11.7.1=0
- cuda-memcheck=11.8.86=0
- cuda-nsight=12.0.78=0
- cuda-nsight-compute=12.0.0=0
- cuda-nvcc=11.7.99=0
- cuda-nvdisasm=12.0.76=0
- cuda-nvml-dev=11.7.91=0
- cuda-nvprof=12.0.90=0
- cuda-nvprune=11.7.91=0
- cuda-nvrtc=11.7.99=0
- cuda-nvrtc-dev=11.7.99=0
- cuda-nvtx=11.7.91=0
- cuda-nvvp=12.0.90=0
- cuda-runtime=11.7.1=0
- cuda-sanitizer-api=12.0.90=0
- cuda-toolkit=11.7.1=0
- cuda-tools=11.7.1=0
- cuda-visual-tools=11.7.1=0
- cudatoolkit=11.0.221=h6bb024c_0
- debugpy=1.5.1=py38h295c915_0
- decorator=5.1.1=pyhd3eb1b0_0
- executing=0.8.3=pyhd3eb1b0_0
- flit-core=3.8.0=py38h06a4308_0
- gds-tools=1.5.0.59=0
- importlib_metadata=6.0.0=hd3eb1b0_0
- ipykernel=6.19.2=py38hb070fc8_0
- ipython=8.12.0=py38h06a4308_0
- jedi=0.18.1=py38h06a4308_1
- jupyter_client=8.1.0=py38h06a4308_0
- jupyter_core=5.3.0=py38h06a4308_0
- ld_impl_linux-64=2.38=h1181459_1
- libcublas=11.10.3.66=0
- libcublas-dev=11.10.3.66=0
- libcufft=10.7.2.124=h4fbf590_0
- libcufft-dev=10.7.2.124=h98a8f43_0
- libcufile=1.5.0.59=0
- libcufile-dev=1.5.0.59=0
- libcurand=10.3.1.50=0
- libcurand-dev=10.3.1.50=0
- libcusolver=11.4.0.1=0
- libcusolver-dev=11.4.0.1=0
- libcusparse=11.7.4.91=0
- libcusparse-dev=11.7.4.91=0
- libffi=3.4.2=h6a678d5_6
- libgcc-ng=11.2.0=h1234567_1
- libgomp=11.2.0=h1234567_1
- libnpp=11.7.4.75=0
- libnpp-dev=11.7.4.75=0
- libnvjpeg=11.8.0.2=0
- libnvjpeg-dev=11.8.0.2=0
- libsodium=1.0.18=h7b6447c_0
- libstdcxx-ng=11.2.0=h1234567_1
- matplotlib-inline=0.1.6=py38h06a4308_0
- ml-collections
- ncurses=6.4=h6a678d5_0
- nest-asyncio=1.5.6=py38h06a4308_0
- nsight-compute=2022.4.0.15=0
- openssl=1.1.1t=h7f8727e_0
- parso=0.8.3=pyhd3eb1b0_0
- pexpect=4.8.0=pyhd3eb1b0_3
- pickleshare=0.7.5=pyhd3eb1b0_1003
- pip=23.0.1=py38h06a4308_0
- platformdirs=2.5.2=py38h06a4308_0
- prompt-toolkit=3.0.36=py38h06a4308_0
- ptyprocess=0.7.0=pyhd3eb1b0_2
- pure_eval=0.2.2=pyhd3eb1b0_0
- pygments=2.11.2=pyhd3eb1b0_0
- python=3.8.16=h7a1cb2a_3
- python-dateutil=2.8.2=pyhd3eb1b0_0
- pytorch-cuda=11.7=h67b0de4_1
- pyzmq=23.2.0=py38h6a678d5_0
- readline=8.2=h5eee18b_0
- setuptools=65.6.3=py38h06a4308_0
- six=1.16.0=pyhd3eb1b0_1
- sqlite=3.41.1=h5eee18b_0
- stack_data=0.2.0=pyhd3eb1b0_0
- tk=8.6.12=h1ccaba5_0
- tornado=6.2=py38h5eee18b_0
- traitlets=5.7.1=py38h06a4308_0
- typing_extensions=4.4.0=py38h06a4308_0
- wcwidth=0.2.5=pyhd3eb1b0_0
- xz=5.2.10=h5eee18b_1
- zeromq=4.3.4=h2531618_0
- zipp=3.11.0=py38h06a4308_0
- zlib=1.2.13=h5eee18b_0
- pip:
- absl-py==1.3.0
- addict==2.4.0
- appdirs==1.4.4
- argparse==1.4.0
- batchgenerators==0.25
- beautifulsoup4==4.11.1
- cachetools==5.2.0
- chardet==3.0.4
- charset-normalizer==3.1.0
- click==8.1.3
- cmake==3.26.3
- contourpy==1.0.7
- cycler==0.11.0
- docker-pycreds==0.4.0
- efficientnet-pytorch==0.7.1
- entrypoints==0.3
- exceptiongroup==1.1.1
- filelock==3.8.2
- flake8==3.7.9
- fonttools==4.39.3
- ftfy==6.1.1
- future==0.18.2
- gdown==4.6.0
- gensim==4.3.1
- gitdb==4.0.10
- gitpython==3.1.31
- google-auth==2.15.0
- google-auth-oauthlib==0.4.6
- googletrans==3.0.0
- grpcio==1.51.1
- h11==0.9.0
- h2==3.2.0
- h5py==3.8.0
- hpack==3.0.0
- hstspreload==2023.1.1
- httpcore==0.9.1
- httpx==0.13.3
- huggingface-hub==0.11.1
- hyperframe==5.2.0
- idna==2.10
- imageio==2.28.0
- importlib-metadata==5.2.0
- importlib-resources==5.12.0
- iniconfig==2.0.0
- isort==4.3.21
- jinja2==3.1.2
- joblib==1.2.0
- kiwisolver==1.4.4
- lazy-loader==0.2
- linecache2==1.0.0
- lit==16.0.3
- littleutils==0.2.2
- markdown==3.4.1
- markupsafe==2.1.1
- matplotlib==3.7.1
- mccabe==0.6.1
- mpmath==1.3.0
- munch==3.0.0
- networkx==3.1
- nibabel==5.1.0
- nltk==3.8.1
- numpy==1.24.2
- nvidia-cublas-cu11==11.10.3.66
- nvidia-cuda-cupti-cu11==11.7.101
- nvidia-cuda-nvrtc-cu11==11.7.99
- nvidia-cuda-runtime-cu11==11.7.99
- nvidia-cudnn-cu11==8.5.0.96
- nvidia-cufft-cu11==10.9.0.58
- nvidia-curand-cu11==10.2.10.91
- nvidia-cusolver-cu11==11.4.0.1
- nvidia-cusparse-cu11==11.7.4.91
- nvidia-nccl-cu11==2.14.3
- nvidia-nvtx-cu11==11.7.91
- oauthlib==3.2.2
- ogb==1.3.5
- opencv-python==4.6.0.66
- outdated==0.2.2
- packaging==22.0
- pandas==1.5.2
- pathtools==0.1.2
- pillow==9.5.0
- pluggy==1.0.0
- pretrainedmodels==0.7.4
- protobuf==3.20.3
- psutil==5.9.4
- pyasn1==0.4.8
- pyasn1-modules==0.2.8
- pycocotools==2.0.6
- pycodestyle==2.5.0
- pyflakes==2.1.1
- pyparsing==3.0.9
- pytest==7.3.1
- pytz==2022.7
- pywavelets==1.4.1
- pyyaml==6.0
- regex==2022.10.31
- requests==2.28.2
- requests-oauthlib==1.3.1
- rfc3986==1.5.0
- rsa==4.9
- scikit-image==0.20.0
- scikit-learn==1.2.0
- scipy==1.9.1
- sentry-sdk==1.18.0
- setproctitle==1.3.2
- simpleitk==2.2.1
- smart-open==6.3.0
- smmap==5.0.0
- sniffio==1.3.0
- soupsieve==2.3.2.post1
- supervision==0.3.2
- surface-distance-based-measures==0.1
- sympy==1.12
- tabulate==0.9.0
- tb-nightly==2.12.0a20221225
- tensorboard-data-server==0.6.1
- tensorboard-plugin-wit==1.8.1
- textaugment==1.3.4
- textblob==0.17.1
- threadpoolctl==3.1.0
- tifffile==2023.4.12
- timm==0.6.13
- tokenizers==0.13.3
- tomli==2.0.1
- torch==2.0.1
- torchaudio
- torchvision==0.15.2
- tqdm==4.64.1
- traceback2==1.4.0
- transformers==4.27.4
- triton==2.0.0
- unittest2==1.1.0
- urllib3==1.26.15
- wandb==0.14.0
- werkzeug==2.2.2
- wget==3.2
- wheel==0.38.4
- wilds==1.2.2
- yacs==0.1.8
- yapf==0.29.0
prefix: /home/ubuntu/anaconda3/envs/dassl
🔍 原因分析
- 哈希值冲突:
h2bc3f7f_2
这类后缀是作者本地环境的编译标识,与其他机器不兼容。 - 路径污染:
environment.yml
文件中可能包含prefix: /Users/author/path
,指向作者本地环境路径。 - CUDA 组件版本混杂:如
cuda=11.7.1
和cudatoolkit=11.0.221
并存,易引发版本冲突。
✅ 解决方案
📌 步骤 1:清理 yml 文件
- 删除哈希值:将yml文件依赖的每一项第二个等号后面的内容删除,如
cudatoolkit=11.3.1=h2bc3f7f_2
改为cudatoolkit=11.3.1
- 移除
prefix
行:避免路径污染 - 统一 CUDA 版本:确保所有 CUDA 相关依赖版本一致
- 如果完成上述操作后,仍然有一些第三方依赖仍然出现ResolveNotNotFoundError错误,手动删除。待虚拟环境创建成功后手动安装。
# 处理后的 environment.yml
name: s-sam
channels:
- pytorch
- nvidia
- defaults
dependencies:
- _libgcc_mutex=0.1
- asttokens=2.0.5
- backcall=0.2.0
- ca-certificates=2023.01.10
- certifi=2022.12.7
- comm=0.1.2
- cuda=11.7.1
- cuda-cccl=11.7.91
- cuda-command-line-tools=11.7.1
- cuda-compiler=11.7.1
- cuda-cudart=11.7.99
- cuda-cudart-dev=11.7.99
- cuda-cuobjdump=11.7.91
- cuda-cupti=11.7.101
- cuda-cuxxfilt=11.7.91
- cuda-demo-suite=12.0.76
- cuda-documentation=12.0.76
- cuda-libraries=11.7.1
- cuda-libraries-dev=11.7.1
- cuda-memcheck=11.8.86
- cuda-nsight-compute=12.0.0
- cuda-nvcc=11.7.99
- cuda-nvdisasm=12.0.76
- cuda-nvml-dev=11.7.91
- cuda-nvprof=12.0.90
- cuda-nvprune=11.7.91
- cuda-nvrtc=11.7.99
- cuda-nvrtc-dev=11.7.99
- cuda-nvtx=11.7.91
- cuda-nvvp=12.0.90
- cuda-runtime=11.7.1
- cuda-sanitizer-api=12.0.90
- cuda-toolkit=11.7.1
- cuda-tools=11.7.1
- cuda-visual-tools=11.7.1
- cudatoolkit=11.0.221
- debugpy=1.5.1
- decorator=5.1.1
- executing=0.8.3
- flit-core=3.8.0
- importlib_metadata=6.0.0
- ipykernel=6.19.2
- ipython=8.12.0
- jedi=0.18.1
- jupyter_client=8.1.0
- jupyter_core=5.3.0
- libcublas=11.10.3.66
- libcublas-dev=11.10.3.66
- libcufft=10.7.2.124
- libcufft-dev=10.7.2.124
- libcurand=10.3.1.50
- libcurand-dev=10.3.1.50
- libcusolver=11.4.0.1
- libcusolver-dev=11.4.0.1
- libcusparse=11.7.4.91
- libcusparse-dev=11.7.4.91
- libffi=3.4.2
- libnpp=11.7.4.75
- libnpp-dev=11.7.4.75
- libnvjpeg=11.8.0.2
- libnvjpeg-dev=11.8.0.2
- libsodium=1.0.18
- matplotlib-inline=0.1.6
- nest-asyncio=1.5.6
- nsight-compute=2022.4.0.15
- openssl=1.1.1t
- parso=0.8.3
- pexpect=4.8.0
- pip=23.0.1
- platformdirs=2.5.2
- prompt-toolkit=3.0.36
- ptyprocess=0.7.0
- pure_eval=0.2.2
- pygments=2.11.2
- python=3.8.16
- python-dateutil=2.8.2
- pytorch-cuda=11.7
- pyzmq=23.2.0
- setuptools=65.6.3
- six=1.16.0
- sqlite=3.41.1
- stack_data=0.2.0
- tk=8.6.12
- tornado=6.2
- traitlets=5.7.1
- typing_extensions=4.4.0
- wcwidth=0.2.5
- xz=5.2.10
- zeromq=4.3.4
- zipp=3.11.0
- zlib=1.2.13
📌 步骤 2:配置国内 Conda 镜像源
# 添加清华源并设置优先级
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config --set channel_priority strict
📌 步骤 3:手动安装缺失包
# 示例:修复 libgcc-ng 缺失
conda install -c conda-forge libgcc-ng=11.2.0
💥 问题 2:pip 依赖安装失败——环境隔离的艺术
🛑 踩坑现象
Conda 依赖安装成功后,pip install
突然报错:
ERROR: Could not find a version that satisfies the requirement torch==1.9.0+cu111
pip failed with error code 1
🔍 原因分析
- 混合依赖管理:yml 中同时存在 Conda 和 Pip 安装项,易引发版本冲突。
- 环境污染:未激活虚拟环境直接安装,导致包被装到全局环境。
✅ 终极解决方案
📌 步骤 1:拆分依赖文件
- 将
pip:
下的内容提取为requirements.txt
- 清理后的 yml 文件仅保留 Conda 依赖
# environment.yml
dependencies:
- python=3.8
- cudatoolkit=11.3
# 其他 Conda 依赖...
📌 步骤 2:分步安装
conda env create -f environment.yml # 先装 Conda 依赖
conda activate my_project_env # 务必激活环境!
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
📌 步骤 3:核验安装结果
conda list | grep "cudatoolkit" # 验证 CUDA 版本
python -c "import torch; print(torch.cuda.is_available())" # 输出应为 True
🚀 避坑指南:3个必检项
-
🔄 版本对齐原则
- CUDA 驱动版本、
cudatoolkit
、PyTorch 版本需严格匹配 - 参考 PyTorch 官方版本矩阵
- CUDA 驱动版本、
-
🛠 环境隔离
- 必须 在虚拟环境中操作:
conda activate env_name
- 禁止混用
sudo pip install
- 必须 在虚拟环境中操作:
-
🌏 镜像源优化
# 永久配置清华源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple conda config --set show_channel_urls yes
🎯 总结
通过本次踩坑,总结出 yml 文件处理黄金法则:
- 删哈希,清路径 —— 标准化依赖声明
- 拆管道,分步走 —— Conda 与 Pip 隔离安装
- 锁版本,验环境 —— 安装后务必验证关键依赖
🔥 终极救命指令
如果环境彻底崩溃,可运行:
conda clean --all
conda remove --name env_name --all
然后重新安装,避免深陷 Conda 恶循环地狱。希望这篇指南能让你少走弯路,顺利驯服 Conda 环境! 💻🚀
💡 技术彩蛋:遇到玄学报错时,尝试
conda update -n base -c defaults conda
升级 Conda 本体,或许有奇效! 🎉
参考文章
[使用配置文件创建conda环境](https://blog.csdn.net/qq_40750972/article/details/123868849)
[关于Anaconda通过environment.yml配置环境的常见问题解决办法](https://blog.csdn.net/C20180602_csq/article/details/137155683)