在python中动态生成protobuf rpc命令列表

时间:2018-08-05 15:02:58

标签: python protocol-buffers grpc

您能给我建议吗,一个人怎么能得到python中可能的grpc调用列表(以及调用中使用的对象)?

更确切地说,说我有一个protobuf:

service MyService {
rpc Command1(Command1Request) returns (Command1Response);
rpc Command2(Command2Request) returns (Command2Response);
...
rpc CommandX(CommandXRequest) returns (CommandXResponse);
}
message Command1Request {
    uint64 param1 = 2;
}

我想要的是使用控制台实用程序生成protobuf。我有argparse并希望能够为我的实用程序动态生成命令列表:

my_utility --Command1 --param1 <value>
my_utility --Command2 --param2 <value>
... 

现在,我使用dir()方法获取对象列表,因此已修复了protobuf的特殊命名约定:如果我具有“ Command2Response”,则调用的对象是“ Command2Request”,而调用请求的方法是“ Command2”。

是否有更正确的方法来获取可能的调用列表(命名约定太容易出现人为错误)?

3 个答案:

答案 0 :(得分:0)

好像您在寻找gRPC Python中的服务器反射?

https://github.com/grpc/grpc/blob/master/doc/server-reflection.md

答案 1 :(得分:0)

答案 2 :(得分:0)

假设此protobuf的生成的python代码是实用工具的一部分,则可以通过protobuf描述符获取.proto文件中定义的所有类型信息。例如: https://github.com/google/protobuf/blob/master/python/google/protobuf/internal/descriptor_test.py#L635

在您的情况下,它将类似于:

  

service_descriptor = your_proto_pb2.DESCRIPTOR.services_by_name ['MyService']

一旦有了服务描述符,就可以获得此服务中定义的rpc方法的列表,这些方法中使用的请求/响应类型等等。看到: https://github.com/google/protobuf/blob/master/python/google/protobuf/descriptor.py#L748