Windows更新conda环境时如何忽略包构建标识解决ResolvePackageNotFound报错
conda跨平台复用yml环境忽略构建标识的方案
conda 本身没有给conda env update命令内置你预期的--no-build参数,带Linux专属构建号的yml直接在Windows执行报ResolvePackageNotFound是必然结果,用下面几个方法就能解决:
- 方案1:直接清理现有yml文件的构建标识
你拿到的yml里所有包条目都是包名=版本号=构建串的格式,只需要把第二个等号和后面的构建串全部删掉,改成包名=版本号的格式,conda就会自动匹配当前Windows平台下对应版本的可用安装包,不会再找不存在的Linux构建版。
Windows下不用手动一条条改,直接在yml所在目录打开PowerShell,执行下面的命令就能批量生成清理后的配置文件:Get-Content exp_env.yml | ForEach-Object { $_ -replace '=[a-z0-9]+_\d+$', '' } | Set-Content exp_env_clean.yml
清理完直接执行更新命令即可:conda env update --file exp_env_clean.yml --prune - 方案2:从源环境导出时就生成跨平台兼容配置
如果还能访问原来的Linux环境,导出yml阶段就避开平台专属内容,省得后续清理:- 要保留全依赖版本号:执行
conda env export --no-builds -f exp_env_nobuild.yml,导出的文件会保留所有依赖的精确版本,只去掉平台绑定的构建串,只需要手动删掉里面Linux专属的系统包(比如libgcc-ng、ld_impl_linux-64这类),拿到Windows就能直接用 - 要最高跨平台兼容性:执行
conda env export --from-history -f exp_env_cross.yml,只会导出你主动安装的包,不会带出自动安装的子依赖,也不带任何构建标识,文件精简,跨平台不会报找不到包的问题,缺点是子依赖版本不会和原Linux环境完全一致,一般不影响代码运行
- 要保留全依赖版本号:执行
- 方案3:安装时强制忽略构建标识
要是不想改yml文件,可以先把yml里dependencies下的所有包条目提取出来存成纯文本的依赖列表,然后用conda install命令带--no-builds参数安装,这个参数会强制忽略所有构建号匹配,自动适配当前平台:conda install --file dep_list.txt --no-builds --prune
注意:Linux环境导出的配置里必然存在一批Windows平台根本不存在的底层系统依赖,不管用哪个方案,遇到这类包直接删除条目即可,conda会自动安装Windows下对应的等价依赖(比如VC运行时),不需要强行找对应安装包。
内容的提问来源于stack exchange,提问作者Python
相关产品推荐
相关产品推荐

