Stable Diffusion WebUI 启动报错修复
一、问题背景
在使用 Stable Diffusion WebUI 时,安装了 sd-webui-roop 插件后,启动时出现了一个典型的 Protobuf 版本冲突错误:
AttributeError: 'MessageFactory' object has no attribute 'GetPrototype'
这个错误通常意味着:
- Protobuf 被自动升级到了 4.x / 5.x / 6.x 系列版本
- 而 ControlNet、roop 等插件依赖的是 Protobuf 3.x 的旧 API
- 新版本 Protobuf 移除了 GetPrototype 方法,导致兼容性崩溃
这个问题非常常见,尤其是在近期,很多插件的依赖约束不严格,会让 pip 自动把 Protobuf 升级到最新版。而且几乎每次重新启动都会出现 Protobuf 的升降级安装操作,严重拖慢启动时间。
二、问题原因深度分析
通过日志分析和依赖回溯,发现问题由以下几个因素共同导致:
1. sd-webui-roop 的 requirements.txt 没有限制 Protobuf 版本
原始内容如下:
insightface==0.7.3 onnx==1.14.0 onnxruntime==1.15.0 opencv-python==4.7.0.72 ifnude cython
注意:这里没有任何关于 protobuf 的版本约束。
2. onnx==1.14.0 的内置依赖要求 protobuf>=3.20.2
但它没有设置上限,于是 pip 会认为:
protobuf >= 3.20.2 → 可以安装最新版(如 6.33.4)
于是 Protobuf 被自动升级到不兼容版本。
3. ControlNet 等插件依赖 Protobuf 3.x 的旧 API
Protobuf 4.x+ 对 Python API 做了大量不兼容修改,其中就包括:
MessageFactory.GetPrototype() → 被移除
于是出现启动报错。
三、环境信息(可复现)
为了让大家能够复刻修复过程,参考环境如下:
- Windows 11
- Python 3.11+
- 虚拟环境:.venv
- CMake
- pip
- WebUI:v1.10.1
- 插件:sd-webui-roop(最新版)、sd-webui-controlnet v1.1.455
四、完整修复方案(可直接操作)
下面是经过验证的完整修复步骤。


