Conda导入现有环境yaml文件触发意外错误的修复方案
问题根因
这个报错和conda版本高低没有直接关系,核心是四个问题:
- 新版Conda默认启用安全YAML解析模式,识别不了配置里
channels: !!python/tuple这种Python专属的序列化标签,文件解析阶段就直接崩溃,根本走不到后续依赖安装流程。 - 配置文件末尾硬编码了原导出者的本地环境路径
prefix: C:\Users\IEUser\Anaconda3\envs\DAND,和你本地Anaconda安装路径不匹配,会触发解析异常。 - 你要导入的是2016年打包的Python2.7旧环境,里面大量依赖是用VC9(VS2008)编译的老版本包,新版Anaconda默认源早就把这批包下架了,就算过了解析步骤也会报包不存在。
- 你写的执行命令路径转义错误,Windows终端不识别单引号作为路径包裹符,给路径片段单独加单引号,会被系统识别成路径的一部分,直接找不到目标yaml文件。
修复步骤
1. 先修改yaml配置文件,解决解析错误
用文本编辑器打开dand-env-win.yaml,做三处修改:
- 找到第二行
channels: !!python/tuple,直接删掉!!python/tuple这部分,保留channels:和下面的- defaults即可。 - 直接删除文件最后一行
prefix: C:\Users\IEUser\Anaconda3\envs\DAND,这个字段是导出环境时自动生成的本地绝对路径,导入时不需要保留,conda会自动在你本地的envs目录生成对应路径。 - 把channels块补充成下面的内容,加入存旧包的free频道和社区维护的conda-forge频道,避免后续找不到包:
channels: - defaults - conda-forge - free
改完保存文件,在命令行执行下面的命令关闭严格的源优先级校验,避免旧包被高优先级源拦截:
conda config --set channel_priority flexible
2. 修正执行命令的路径写法
注意:Windows的cmd和PowerShell不识别单引号作为路径包裹符,给带空格的路径加单引号会导致系统把单引号当成路径名的一部分,直接报文件不存在。
你需要直接给完整路径套双引号,执行下面的命令创建环境:
conda env create -f "D:\Courses\Udacity-Courses\Introduction to Data Analysis\Supporting-Material\dand-env-win.yaml"
3. 若仍报包不存在,手动搭建兼容环境
如果执行完上面的步骤还是提示找不到部分VC9编译的旧包,不用死磕原配置文件,手动创建Python2.7环境安装课程需要的依赖即可,功能完全一致:
- 创建空的Python2.7环境:
conda create -n DAND python=2.7 -y
- 激活环境:
conda activate DAND
- 安装课程所需的核心依赖,不需要严格匹配2016年的旧版本,Python2.7分支下兼容的版本都可以正常运行课程代码:
conda install numpy pandas matplotlib seaborn scikit-learn scipy jupyter nltk beautifulsoup4 requests pymongo unicodecsv xlrd -y
- 剩余的小依赖用pip补装即可:
pip install win-unicode-console backports.ssl-match-hostname
补充说明
Python2.7在2020年就已经停止官方维护,和新版Windows、Anaconda的兼容问题会越来越多,如果后续跑代码遇到奇怪的兼容问题,可以安装2016年同期发布的Anaconda2 4.2.0版本(和这个环境的依赖版本完全对应),或者用Win7虚拟机部署,不会出现任何兼容问题。
内容的提问来源于stack exchange,提问作者Nader Shehata
相关产品推荐
相关产品推荐

