PythonAnywhere重复运行Keras/TensorFlow脚本报TypeError如何解决
报错根因
这个TypeError: A Message class can only inherit from Message是protobuf库版本与TensorFlow/Keras不兼容导致的。
出现首次运行正常、第二次运行必报错、重启控制台才恢复的现象,和PythonAnywhere的环境特性直接相关:平台全局预装了4.x版本的protobuf,而Python3.7/3.8软件源提供的TensorFlow为2.6及更早的旧版本,这些旧版TensorFlow是基于3.x版本protobuf生成的proto类。首次导入时模块加载顺序刚好绕过了校验逻辑,第二次运行时因为Python模块缓存机制,两个版本的protobuf类定义冲突,就会触发继承校验错误。本地Python3.9环境运行正常,是因为本地安装的TensorFlow版本更高,已经适配4.x版protobuf,和PythonAnywhere的环境情况不具备可比性。
可行修复方案
按顺序操作即可:
- 安装兼容版本的protobuf
针对你使用的Python3.8环境,强制安装3.x系列的稳定兼容版,执行命令:
安装完必须完全关闭当前控制台,新开一个会话再测试,旧控制台里已经缓存的错误模块不会自动刷新。pip3.8 install --user protobuf==3.20.3 - 若上述操作后仍偶发报错,在脚本最顶部添加环境变量声明
把以下代码放在脚本的最开头,所有import语句之前,强制使用纯Python实现的protobuf解析逻辑,绕过C扩展的版本冲突:import os os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python" # 后续再写import keras、import tensorflow等导入逻辑 - 避免在同一个交互式Shell会话里重复加载TensorFlow相关脚本
如果你习惯在Python交互环境中用exec()方式反复运行脚本,会触发重复加载的校验bug。日常运行脚本直接在Bash控制台用python3.8 你的脚本文件名.py执行即可,不要在长开的Python交互进程里重复导入TensorFlow。
验证方法
新开控制台后连续执行两次以下命令,若都能正常输出导入成功提示,即为修复完成:
python3.8 -c "import keras; print('keras导入成功')"
注意:不要自行在PythonAnywhere上升级TensorFlow版本,平台提供的预编译包是匹配系统底层依赖的,自行升级会触发更多底层依赖错误。
内容的提问来源于stack exchange,提问作者Omar Naguib
相关产品推荐
相关产品推荐

