源码安装caffe后运行测试项目遇KeyError:找不到枚举caffe.EmitConstraint.EmitType
这个KeyError问题我之前帮不少开发者排查过,核心基本都和Caffe的Python绑定、版本匹配或者编译流程有关,下面是几个最常见的诱因:
Python绑定安装/版本不匹配
编译Caffe时生成的pycaffe模块和你运行测试的Python环境不兼容是头号原因。比如编译时用的是Python3,但运行测试默认调用了Python2;或者编译完成后,既没把Caffe的python目录添加到Python的sys.path,也没执行make pycaffe install把模块安装到系统site-packages,导致Python找不到完整的Caffe模块定义,自然就搜不到这个枚举类型。Caffe源码与测试代码版本不兼容
如果你的测试代码是针对某个新开发分支写的,但你编译的是旧版Caffe源码,那旧版本里可能根本不存在caffe.EmitConstraint.EmitType这个枚举;反过来,要是源码是新的,但编译时相关模块没被启用,也会出现这个问题。另外,用第三方修改过的Caffe版本时,也可能出现源码和Python绑定生成脚本不同步的情况。编译配置选项缺失
检查你的Makefile.config文件,有没有开启相关编译开关。比如和EmitConstraint相关的模块需要特定选项才能被编译进Caffe,如果这些开关没打开,对应的枚举类型就不会被生成到Python绑定里。比如是否启用了USE_CUDNN这类依赖,某些功能模块必须依赖这些选项才能编译。环境变量配置错误
要是没正确设置PYTHONPATH,把Caffe的python目录包含进去,Python可能会加载到其他地方的旧版Caffe模块(比如之前用pip装的),而旧模块里没有这个枚举。运行测试前可以先执行echo $PYTHONPATH,看看路径里有没有你的Caffe源码下的python目录。编译残留或缓存问题
如果你之前编译过旧版Caffe,后来更新了源码但没清理旧编译文件就重新编译,可能会导致生成的Python模块是不完整的旧版本。这种情况建议先执行make clean和make pycaffe clean,再重新跑make all和make pycaffe,确保所有文件都是全新编译的。
内容的提问来源于stack exchange,提问作者Balaji

