0

当在 Linux 中使用最新的 Python Protobuf (3.19.1) 和 Python 3.10(在 Fedora 35 和 Ubuntu 20.04 中测试)时,这就是所有问题。

它破坏了我们的库,但它可以使用addressbook.protoPython 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在使用#格式时。

有人有这个问题或可以确认吗?

4

0 回答 0