747929791 / MajsoulAI

以JianYangAI作后端,进行在线雀魂对局
MIT License
265 stars 59 forks source link

连续两次测试出现KeyError: 'hand'导致进程退出,请问如何解决 #2

Closed tandaqi closed 4 years ago

tandaqi commented 4 years ago

Traceback (most recent call last): File "main.py", line 728, in MainLoop(level=level) File "main.py", line 710, in MainLoop aiWrapper.recvFromMajsoul() File "main.py", line 125, in recvFromMajsoul failed = self.parse(result) File "C:\Users\Blaze\Desktop\MajsoulAI-master\majsoul_wrapper\sdk.py", line 172, in parse hands = [players[i]['hand'] if tingpai[i] else [] File "C:\Users\Blaze\Desktop\MajsoulAI-master\majsoul_wrapper\sdk.py", line 172, in hands = [players[i]['hand'] if tingpai[i] else [] KeyError: 'hand'

错误提示如上,麻烦看下,谢谢

747929791 commented 4 years ago

我这里没有见过这个问题...每次对局会在当前目录产生一个'websocket_frames.pkl'的日志文件记录了所有的websocket通信,方便的话可不可以'$python -m majsoul_wrapper.liqi -l websocket_frames.pkl > liqi.log'解析一下websocket,给我看看liqi.log拿到的数据是什么?以及操作系统,python版本等信息...

tandaqi commented 4 years ago

{'id': 977, 'type': <MsgType.Notify: 1>, 'method': '.lq.ActionPrototype', 'data': {'step': 144, 'name': 'ActionNoTile', 'data': {'liujumanguan': False, 'players': [{'tingpai': False}, {'tingpai': True, 'hand': ['3m', '4m', '5m', '5m', '6m', '7m', '1s', '2s', '2s', '3s', '3s', '4s', '6z'], 'tings': [{'tile': '6z', 'haveyi': True, 'yiman': False, 'count': 1, 'fu': 40, 'biaoDoraCount': 2, 'yimanZimo': False, 'countZimo': 2, 'fuZimo': 30}]}, {'tingpai': True, 'hand': ['0m', '6m', '7m', '8m', '8m', '8s', '8s'], 'tings': [{'tile': '8s', 'haveyi': True, 'yiman': False, 'count': 1, 'fu': 30, 'biaoDoraCount': 2, 'yimanZimo': False, 'countZimo': 1, 'fuZimo': 40}, {'tile': '8m', 'haveyi': True, 'yiman': False, 'count': 1, 'fu': 30, 'biaoDoraCount': 2, 'yimanZimo': False, 'countZimo': 1, 'fuZimo': 40}]}, {'tingpai': False}], 'scores': [{'oldScores': [24000, 35000, 27000, 13000], 'deltaScores': [-1500, 1500, 1500, -1500]}]}}}

这个是最后两句有意义的输出,报错出现在下一局开始前

747929791 commented 4 years ago

已在最新版修复。在我这里没有{'tingpai': False}这种数据而直接是{},目测可能是不同protobuf版本、雀魂版本引起的差异。

tandaqi commented 4 years ago

{'id': 552, 'type': <MsgType.Notify: 1>, 'method': '.lq.ActionPrototype', 'data': {'step': 143, 'name': 'ActionDiscardTile', 'data': {'seat': 2, 'tile': '6m', 'isLiqi': False, 'moqie': True, 'zhenting': True, 'isWliqi': False}}}

{'id': 553, 'type': <MsgType.Notify: 1>, 'method': '.lq.ActionPrototype', 'data': {'step': 144, 'name': 'ActionNoTile', 'data': {'liujumanguan': False, 'players': [{'tingpai': False}, {'tingpai': True, 'hand': ['1m', '1m', '4m', '4m', '3p', '3p', '4p', '4p', '8p', '8p', '5s', '5s', '5z'], 'tings': [{'tile': '5z', 'haveyi': True, 'yiman': False, 'count': 2, 'fu': 25, 'biaoDoraCount': 0, 'yimanZimo': False, 'countZimo': 3, 'fuZimo': 25}]}, {'tingpai': True, 'hand': ['4m', '4m', '6m', '7m', '8m', '3p', '4p', '7p', '8p', '9p', '0s', '6s', '7s'], 'tings': [{'tile': '2p', 'haveyi': True, 'yiman': False, 'count': 2, 'fu': 30, 'biaoDoraCount': 1, 'yimanZimo': False, 'countZimo': 3, 'fuZimo': 20}, {'tile': '5p', 'haveyi': True, 'yiman': False, 'count': 2, 'fu': 30, 'biaoDoraCount': 1, 'yimanZimo': False, 'countZimo': 3, 'fuZimo': 20}]}, {'tingpai': False}], 'scores': [{'oldScores': [25000, 21800, 24000, 28200], 'deltaScores': [-1500, 1500, 1500, -1500]}]}}}

更新了最新版之后依然出现这个问题,不过和之前相比,现在可以完整打完一局,但是在第二局的第二场比赛结束依然会报主回复中的错误,这个问题重复了两次,我的环境protobuf版本为3.12.2(默认安装的版本会出现AttributeError: module 'google.protobuf.descriptor' has no attribute '_internal_create_key”的错误,升级后正常)chrome及driver版本为 84.0.4147.30

747929791 commented 4 years ago

我尝试在python交互式环境里复现了上面这段数据在sdk.py中的载入过程,没有出现KeyError 'hand'问题,一切都看起来非常完美。

由于我这里复现不了这个问题,如果有条件的话可否在VS Code等工具的DEBUG模式里直接运行main.py,并直接在入口处调用主函数MainLoop(level=None)直至发生错误,观察一下错误处的相关变量(主要是data,players,tingpai和hands)的解析有什么异常?