如何为具有多个python包的项目定义/组织proto文件?

时间:2018-02-25 23:32:25

标签: python protocol-buffers packages grpc

如何为包含两个(或更多)python包的项目定义和组织gRPC proto文件?

假设我有以下monorepo结构:

my_project/  
 |
 |-my_client_pkg/
 |  |_Dockerfile
 |  |_setup.py
 |  |_my_client/
 |     |___init__.py
 |     |_client.py
 |
  -my_server_pkg/
    |_Dockerfile
    |_setup.py
    |_my_server/
       |___init__.py
       |_server.py

我想使用gRPC将这两个服务连接在一起。我可以添加一个protos/目录,其中包含适当的子目录,如下所示:

my_project/  
 |
 |-protos/
 |  |_my_client_pkg/
 |  |  |_my_client.proto
 |  |
 |  |_my_server_pkg/
 |     |_my_server.proto
 |
 |-my_client_pkg/
 |  |_Dockerfile
 |  |_setup.py
 |  |_my_client/
 |     |___init__.py
 |     |_client.py
 |
  -my_server_pkg/
    |_Dockerfile
    |_setup.py
    |_my_server/
       |___init__.py
       |_server.py

这是有效的:我可以使用正确的import语句正确生成.py文件。这种方法的问题在于我必须复制从my_client.protomy_server.proto的所有内容。如果我需要进行更改,它必须在两个文件中,显然容易出错。它似乎真的打败了protobufs的目的。

我应该如何组织我的原型文件?是否可以在一个地方定义proto,然后使用proto import语句无缝复制定义?我应该做一些完全不同的事情吗?

编辑: 这是一个示例proto文件:

syntax = "proto3";

message AbcRequest {
  string utterance = 1;
}

message AbcResponse {
  string value = 2;
}

service Abc {
  rpc most_similar(AbcRequest) returns (AbcResponse) {}
}

我确实尝试在一个地方定义原型,然后导入它:

my_project/  
 |
 |-protos/
 |  |-base.proto
 |  |_my_client_pkg/
 |  |  |_my_client.proto
 |  |
 |  |_my_server_pkg/
 |     |_my_server.proto

my_client.proto和my_server.proto都只有:

syntax = "proto3";
import "protos/base.proto";

但是,当我生成python代码时,* _grpc.py文件中没有任何内容。我是否应该为导入工作做其他事情?

1 个答案:

答案 0 :(得分:1)

protobuf import语句允许您访问在其他文件中定义的定义,但只会为该文件中定义的消息/服务生成代码。
syntax = "proto3"; import "protos/base.proto";

将生成空文件,因为此文件中没有定义服务/消息。

您导入的文件的代码将位于base_pb2_grpc

我建议您使用包含所有定义的单个my_service.proto文件,并且只需引用my_client和my_server包中生成的_pb2_grpc.py文件。