【问题标题】:Latest Google protobuf not working on app engine最新的 Google protobuf 不适用于应用引擎
【发布时间】:2022-10-20 10:21:24
【问题描述】:
对于我的 GAE 应用程序,我正在更新 requirements.txt 中的库,然后,我收到与 protobuf 相关的错误消息。
TypeError:不能直接创建描述符。如果这个电话
来自 _pb2.py 文件,您生成的代码已过时,必须
使用 protoc >= 3.19.0 重新生成。如果您不能立即
重新生成您的原型,其他一些可能的解决方法是:
- 将 protobuf 包降级到 3.20.x 或更低版本。
- 设置 PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python(但这将使用纯 Python 解析并且会慢得多)。更多信息:
https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates
我没有直接使用 protobuf,所以其他 Google 库似乎正在使用它。添加
protobuf==3.20.3
根据我的要求。文本修复它。
但是......发生了什么事,我需要做多长时间?我没有从 Google 在线找到任何有用的信息。
必须将库固定到旧版本是很麻烦的,因为在某些时候会出现问题。
【问题讨论】:
标签:
python
google-app-engine
protocol-buffers
protobuf-python
【解决方案1】:
目前,协议缓冲区版本4.21.0 在使用时包含一些重大更改。由于您提到您间接使用 protobuf,因此 Python 仍在调用最新更新。您可以在Protocol Buffers for Python Updates 上查看此链接。
作为一种解决方法,正如错误消息所建议的那样,您可以安装 protobuf 版本 3.20.x 或更低版本,或者在您的 requirements.txt 文件中设置 protobuf==3.20.x 以覆盖最新版本。
在 Google 为我们提供修复之前,我们没有时间框架来说明我们需要多长时间执行此解决方法。
我也建议file a bug,因为这绝对是一个需要解决的主要问题。
更新:
以前在github 中为版本4.21.0 提交了一个错误,建议现在应该使用版本3.19.x 或3.20.x,并且已经提出了添加向后兼容层的功能请求。
【解决方案2】:
到底是怎么回事?
Protobuf 计划了一个重大更改,并发布了它,更新了主要修订号。
发生这种情况时,protobuf 的用户应该已经使用最新版本重新生成。但谷歌并没有用最新版本重新生成他们的库。
我需要多长时间将 protobuf 固定到旧版本?
直到谷歌修复他们的代码。向使用 protobuf 并为您导致此错误的 Google 库提交错误报告。
必须将库固定到旧版本是很麻烦的,因为在某些时候会出现问题。
使用过时的库是一个安全问题,因为它们没有最新的安全补丁。
但是,除此之外,使用固定版本在本质上没有什么比始终使用最新版本更不稳定的了。事实上,(除了少数例外)通常情况正好相反;它更稳定。固定依赖项会导致确定性的可重复部署,并确保每个开发人员都在相同的代码库上进行测试。