运行BEMOSS时遭遇gevent相关AttributeError报错求助
解决BEMOSS 3.5中的两类AttributeError报错
这两个错误本质都是gevent版本不兼容导致的——BEMOSS 3.5依赖的是较旧版本的gevent API,而你当前安装的gevent版本更新,API结构发生了变化,引发了这些报错。下面是具体的排查和修复方案:
1. 'gevent._event.AsyncResult' object has no attribute 'ident' 错误
问题原因
在gevent 1.3及以上版本中,AsyncResult对象移除了ident属性,但BEMOSS集成的Volttron代码(results.py)依然在引用这个属性来生成唯一标识,触发了报错。
修复步骤
- 打开文件
/home/interview/BEMOSS3.5/volttron/platform/vip/agent/results.py - 定位到第85行的代码:
result.ident == '%s.%s' % (next(self._counter), hash(result)) - 将
result.ident替换为id(result)(Python内置的对象唯一ID),修改后的代码如下:id(result) == '%s.%s' % (next(self._counter), hash(result)) - 保存文件后,重启bacnet_proxyagent、VIPagent等相关服务,该错误即可消失。
2. AttributeError: 'module' object has no attribute 'core' 错误
问题原因
gevent 1.0+版本重构了核心模块,原来的gevent.core被移除,gevent.core.time的功能迁移到了gevent.hub的事件循环中,而AuthService的zap_loop方法依然在调用旧的API路径。
修复步骤
- 打开文件
/home/interview/BEMOSS3.5/volttron/platform/auth.py - 找到第147行的代码:
time = gevent.core.time - 将其替换为调用事件循环时间的新写法:
from gevent.hub import get_hub time = get_hub().loop.time - 保存文件后重启AuthService,该错误就能解决。
更彻底的版本兼容方案
如果你不想修改代码,可以直接回退到BEMOSS 3.5兼容的gevent版本(推荐1.2.2),执行以下命令:
pip uninstall gevent -y pip install gevent==1.2.2
版本回退后,所有依赖旧gevent API的代码都能正常运行,无需手动修改文件。
内容的提问来源于stack exchange,提问作者Vipul Kumar Maurya
相关产品推荐
相关产品推荐

