如何防止conda env export修改特定依赖配置
问题场景
以下是初始的environment.yml文件片段:
name: my-project channels: - pytorch-nightly - defaults dependencies: - pytorch=1.13.0.* - pip: - https://github.com/explosion/spacy-models/releases/download/nb_core_news_md-3.3.0/nb_core_news_md-3.3.0-py3-none-any.whl prefix: ~/opt/miniconda3/envs/my-project
执行conda env create -f environment.yml创建环境后,运行conda env export > environment.yml重新导出配置,文件会出现两处不符合预期的变更:
name: my-project channels: - pytorch-nightly - defaults dependencies: - pytorch=1.13.0.dev20220614=py3.9_0 - pip: - nb-core-news-md==3.3.0 prefix: ~/opt/miniconda3/envs/my-project
隔天用这个导出的文件重建环境时会触发两个报错:
- PyTorch nightly版本是每日滚动更新的,旧的dev构建
pytorch=1.13.0.dev20220614=py3.9_0会被删除,无法找到对应安装包 nb-core-news-md是通过whl直链安装的,导出后URL被移除,换成了普通的版本号格式,公开源中不存在这个包,无法安装
需求为:conda env export导出时继续锁定其余所有依赖的具体版本,仅不对上述两个依赖项做固化修改。
解决方案
按以下步骤操作即可,完全满足「其余依赖全锁、仅这两项保留灵活配置」的要求:
- 导出时跳过pytorch的自动版本固化
Conda 4.9及以上版本提供了--exclude参数,可以指定导出时跳过特定包的版本解析,执行以下命令导出环境:
这一步导出的文件会自动锁定除pytorch外所有conda依赖的完整版本+构建号,不会出现固定死的nightly dev版本条目。conda env export --exclude pytorch > environment.yml - 手动修正两个特殊依赖的配置
打开导出的environment.yml做两处修改:- 在dependencies的conda包列表里,补回需要的pytorch灵活版本约束:
- pytorch=1.13.0.* - 找到pip依赖段,把自动生成的
- nb-core-news-md==3.3.0整行删除,替换回原来的直链安装配置:- https://github.com/explosion/spacy-models/releases/download/nb_core_news_md-3.3.0/nb_core_news_md-3.3.0-py3-none-any.whl
- 在dependencies的conda包列表里,补回需要的pytorch灵活版本约束:
- (可选)脚本自动化避免重复操作
如果需要频繁导出环境,不用每次手动改文件,写个简单的shell脚本自动完成全流程即可:# 导出环境,排除pytorch conda env export --exclude pytorch > environment.yml # 在channels配置后插入pytorch的通配版本约束 # macOS用下面三行 sed -i '' '/- defaults/a\ - pytorch=1.13.0.* ' environment.yml # Linux环境把上面三行替换成下面这行 # sed -i '/- defaults/a\ - pytorch=1.13.0.*' environment.yml # 替换错误的pip包条目为原始直链 # macOS用下面这行 sed -i '' 's|- nb-core-news-md==3.3.0|- https://github.com/explosion/spacy-models/releases/download/nb_core_news_md-3.3.0/nb_core_news_md-3.3.0-py3-none-any.whl|' environment.yml # Linux环境把上面这行替换成下面这行 # sed -i 's|- nb-core-news-md==3.3.0|- https://github.com/explosion/spacy-models/releases/download/nb_core_news_md-3.3.0/nb_core_news_md-3.3.0-py3-none-any.whl|' environment.yml
注意事项
- 不要用
--no-builds参数,这个参数会移除所有conda包的构建号,等于所有依赖都取消版本锁定,不符合需求。 - 目前Conda没有内置参数可以自动保留pip直链安装的URL,这类非公开源的直链包都需要手动保留或者通过脚本替换,不要直接使用导出时自动生成的对应条目。
- PyTorch nightly通道本身是滚动更新机制,旧构建会定期清理,永远不要锁定nightly版本的完整构建号,用通配符匹配次版本号是正确的用法。
内容的提问来源于stack exchange,提问作者leifericf
相关产品推荐
相关产品推荐

