使用environment.yml 文件创建虚拟环境踩坑记录

最近在本地复现一个开源项目时,作者提供的 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

🔍 原因分析

  1. 哈希值冲突h2bc3f7f_2 这类后缀是作者本地环境的编译标识,与其他机器不兼容。
  2. 路径污染environment.yml 文件中可能包含 prefix: /Users/author/path,指向作者本地环境路径。
  3. CUDA 组件版本混杂:如 cuda=11.7.1cudatoolkit=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个必检项

  1. 🔄 版本对齐原则

  2. 🛠 环境隔离

    • 必须 在虚拟环境中操作:conda activate env_name
    • 禁止混用 sudo pip install
  3. 🌏 镜像源优化

    # 永久配置清华源
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
    conda config --set show_channel_urls yes
    

🎯 总结

通过本次踩坑,总结出 yml 文件处理黄金法则

  1. 删哈希,清路径 —— 标准化依赖声明
  2. 拆管道,分步走 —— Conda 与 Pip 隔离安装
  3. 锁版本,验环境 —— 安装后务必验证关键依赖

🔥 终极救命指令

如果环境彻底崩溃,可运行:

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值