从Python中的依赖Protobuf文件中获取字段名称

问题描述 投票:0回答:2

我有 abc.proto 的 Protobuf 结构,如下所示:

syntax = "proto3";

import "auditData.proto";
import "Date.proto";
import "column_name.proto";

message abc {
    AuditData auditData = 1;
    int32 field2 = 2;
    Date date=3;
    column_name colnm=4
}

我已经转换为abc_pb2.py。 如何仅通过在 python 中提供 abc 输入来获取 AuditData、Date 和 column_names 的字段名称。因为我有太多的文件和依赖项,手动执行是不可能的。

我已经安装了protobuf模块:3.19.4

python protocol-buffers
2个回答
1
投票

要正确使用生成的

auditData.proto
模块,您首先需要将其导入到代码中。然后,构造
AuditData
类来填充
auditData
字段,如下所示:

首先导入生成的模块。 (这假设您的 protobuf 文件位于同一层次结构级别。)

from abc_pb2 import abc
from auditData_pb2 import AuditData

要使用这些类,请按以下步骤操作:

audit_data = AuditData(
  #...
)
data = abc(auditData=audit_data)

在不引入重大更改的情况下维护组织良好的 protobuf 文件可能具有挑战性,特别是如果您的依赖项(例如,

auditData.proto
)位于其他远程存储库中。在这种情况下,我的建议是将这些依赖项与自定义 protobuf 文件一起克隆到更高级别的目录中,例如
protos
。使用命令
python -m grpc_tools.protoc -Iprotos --python_out=. --pyi_out=. --grpc_python_out=.
继续照常编译它们。请注意,我们将 protobuf“源”目录添加到
-I
protoc
标志中。

虽然这种方法有效,但可能很麻烦且重复。这是 protobuf 生态系统中需要改进的痛点之一。

虽然您没有要求工具推荐,但如果您在本地工作区中工作(例如,在同一存储库上与队友协作),您可能会发现我的开源 CLI 工具

sylk
很有用。它简化了 protobuf 管理,无需您每次编译 protobuf 文件时都深入了解
protoc
命令
¯\_(ツ)_/¯

但是,如果您依赖远程存储库,

sylk
目前不支持 Git 集成。在这种情况下,您可能需要考虑
buf
,它可以帮助管理远程依赖关系。

我希望这能够澄清 protobuf 生态系统中的一些挑战。这是一个需要改进的领域,新的工具正在开始解决这些问题。

免责声明:我是 Sylk CLI 工具(一个开源项目)的作者。增强其功能的 PR 非常受欢迎。 :)


0
投票

您可以迭代消息中的所有字段,然后如果它是一条消息,则迭代该消息字段,例如:

        # For every field in the message
        for field in message.fields:
            # Check for nested types
            if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE and field.message_type.name in message.nested_types_by_name:
                for nested_field in field.message_type.fields:
                   # Do stuff, print nested_field.name, etc
© www.soinside.com 2019 - 2024. All rights reserved.