Lev*_*ker 5 python package protocol-buffers grpc
如何为具有两个(或更多)Python 包的项目定义和组织 gRPC 原型文件?
假设我有以下 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
Run Code Online (Sandbox Code Playgroud)
我想使用 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
Run Code Online (Sandbox Code Playgroud)
这有效:我可以使用正确的导入语句正确生成 .py 文件。这种方法的问题是我必须复制my_client.protointo中的所有内容my_server.proto。如果我需要进行更改,则必须在两个文件中进行更改,这显然很容易出错。这似乎确实违背了 protobuf 的目的。
我应该如何组织我的原型文件?是否可以在一处定义 proto,然后使用 protoimport语句无缝地复制定义?我应该做一些完全不同的事情吗?
编辑:这是一个示例原型文件:
syntax = "proto3";
message AbcRequest {
string utterance = 1;
}
message AbcResponse {
string value = 2;
}
service Abc {
rpc most_similar(AbcRequest) returns (AbcResponse) {}
}
Run Code Online (Sandbox Code Playgroud)
我确实尝试在一个地方定义原型,然后导入它:
my_project/
|
|-protos/
| |-base.proto
| |_my_client_pkg/
| | |_my_client.proto
| |
| |_my_server_pkg/
| |_my_server.proto
Run Code Online (Sandbox Code Playgroud)
其中 my_client.proto 和 my_server.proto 都有:
syntax = "proto3";
import "protos/base.proto";
Run Code Online (Sandbox Code Playgroud)
但是,当我生成 python 代码时,*_grpc.py 文件中没有任何内容。我应该做其他事情才能让导入工作像这样吗?
小智 1
protobufimport语句允许您访问其他文件中定义的定义,但只会为该文件中定义的消息/服务生成代码。
syntax = "proto3";
import "protos/base.proto";
将生成空文件,因为该文件中没有定义服务/消息。
您导入的文件的代码将位于base_pb2_grpc.
我建议使用包含my_service.proto所有定义的单个文件,并仅引用_pb2_grpc.pymy_client 和 my_server 包中生成的文件。
| 归档时间: |
|
| 查看次数: |
5401 次 |
| 最近记录: |