我有 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
要正确使用生成的
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 非常受欢迎。 :)
您可以迭代消息中的所有字段,然后如果它是一条消息,则迭代该消息字段,例如:
# 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