运行python时报错TypeError: Descriptors cannot be created directly.
时间: 2025-01-07 16:05:05 浏览: 14
### 错误解析
当遇到 `TypeError: Descriptors cannot be created directly` 这样的错误消息时,通常意味着正在使用的 Protobuf 序列化库版本与生成的 `.proto` 文件不兼容[^1]。
具体来说,如果该调用源自 `_pb2.py` 文件,则表明所使用的代码是由旧版 Protocol Buffer 编译器生成的,在尝试使用较新的 protobuf 版本执行这些文件时就会触发这个异常。这主要是因为新版本中的某些内部实现细节发生了变化,使得旧代码无法正常工作[^2]。
### 解决方案
#### 方法一:更新 Proto 文件
最推荐的做法是利用最新版本(至少为 3.19.0)的 `protoc` 工具来重新编译所有的 `.proto` 定义文件:
```bash
pip install --upgrade protobuf
# 使用 protoc 命令行工具重新生成 .py 文件
protoc --python_out=. path/to/your/file.proto
```
通过这种方式可以确保生成的 Python 类能够正确地同当前安装的 protobuf 库协同工作[^4]。
#### 方法二:回退 Protobuf 版本
如果不具备立即升级 proto 文件的能力,可以选择将 protobuf 包降级至较低版本(如 3.20.x 或更早),从而避免因 API 变动引起的冲突:
```bash
pip uninstall protobuf
pip install protobuf==3.20.0
```
这种方法虽然简单快捷,但也存在一定的局限性——即可能会错过后续发布的功能改进和安全修复[^3]。
#### 方法三:更改环境变量设置
另一种临时性的解决方案是在运行程序之前设定特定的环境变量,强制采用纯 Python 实现来进行序列化操作:
```bash
export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
```
需要注意的是,这样做会导致性能显著下降,因此仅适用于开发调试阶段或是对速度要求不高的情形下作为权宜之计。
阅读全文