当在 Linux 中使用最新的 Python Protobuf (3.19.1) 和 Python 3.10(在 Fedora 35 和 Ubuntu 20.04 中测试)时,这就是所有问题。
它破坏了我们的库,但它可以使用addressbook.proto
Python Protobuf 教程中的轻松测试,并尝试获取 proto2 消息类,如下所示:
import addressbook_pb2
from google.protobuf import (
descriptor_database,
descriptor_pb2,
descriptor_pool,
message_factory,
)
_DESCRIPTOR_DB = descriptor_database.DescriptorDatabase()
_DESCRIPTOR_POOL = descriptor_pool.DescriptorPool(_DESCRIPTOR_DB)
_DESCRIPTOR_DB.Add(
descriptor_pb2.FileDescriptorProto.FromString(
addressbook_pb2.DESCRIPTOR.serialized_pb
)
)
factory = message_factory.MessageFactory()
cls = factory.GetPrototype(_DESCRIPTOR_POOL.FindMessageTypeByName("tutorial.Person"))
它引发以下错误:
[libprotobuf ERROR google/protobuf/pyext/descriptor_database.cc:64] DescriptorDatabase method raised an error
SystemError: PY_SSIZE_T_CLEAN macro must be defined for '#' formats
Traceback (most recent call last):
File "/dev/protobuf/test/test.py", line 21, in <module>
ls = factory.GetPrototype(_DESCRIPTOR_POOL.FindMessageTypeByName("tutorial.Person"))
`KeyError: "Couldn't find message tutorial.Person"
现在,如果我使用较旧的 Python Protobuf 版本(例如 3.18.1),它可以按预期工作。
我打开了一个错误https://github.com/protocolbuffers/protobuf/issues/9245,但显然,它不被视为错误。
Python ProtobufPY_SSIZE_T_CLEAN
在 3.19.1 中引入了宏并破坏了一些东西,可能是通过使用int
而不是Py_ssize_t
在使用#
格式时。
有人有这个问题或可以确认吗?