当前位置: 首页 > 知识库问答 >
问题:

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

杨安歌
2023-03-14

如何为一个包含两个(或更多)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

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

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

这是可行的:我可以生成。py文件正确,具有正确的导入语句。这种方法的问题是,我必须复制我的客户机中的所有内容。proto进入my\u服务器。协议。如果需要进行更改,则必须在两个文件中都进行更改,这显然容易出错。这似乎真的违背了protobufs的目的。

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

编辑:这是一个示例原型文件:

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代码时,*\u grpc。py文件中没有任何内容。我应该做些别的事情来让导入像这样工作吗?

共有1个答案

苗运珧
2023-03-14


import语句允许您访问在其他文件中定义的定义,但只会为在该文件中定义的消息/服务生成代码。
语法="原型3";导入"原型/base.proto";

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

您导入的文件的代码将存在于base_pb2_grpc中。

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

 类似资料:
  • 问题内容: 在开发过程中组织Go项目的标准方法是什么? 我的项目是一个包,所以我想我将所有.go文件放在一个目录中。 但是,然后,我想在开发过程中对其进行测试,因此至少需要一个声明该包的文件,以便我可以 我应该如何组织呢?每次尝试都需要做吗? 问题答案: 我建议阅读有关如何编写Go代码的页面 它记录了如何以友好的方式构建项目以及如何编写测试。使用该程序包不必进行cmd测试。它们可以简单地被Test

  • 问题内容: 我正在尝试通过Swagger UI记录供公司内部使用的,由供应商产品(WSO2 ESB)开发的现有API服务。供应商产品不支持摇摇欲坠。我计划以编程方式检查/处理我的API服务的源代码(用卖方产品编写),并生成.json或.yml格式的swagger定义文件的目录/文件夹/库。很好,我可以做到。 这些API定义文件中的每一个都可以在swagger UI中很好地呈现,我正在使用https

  • 我有这样一个gRPC API定义(来自Akka docs示例),但要长得多(4000行,仅是服务部分)。 然而,RPC列表现在变得太长了,我想以某种方式将其“分解”为多个文件,以便文件更具可读性。像这样的 即使只是在不同的文件中分别定义RPC,然后编写类似的内容也会对我有所帮助: 是否有可能在gRPC协议定义中以某种方式“组合”服务?

  • 我的项目由多个模块组成。每个模块都可以独立运行,并有单独的log4j2.xml 假设项目X由三个模块组成: 模块A具有log4j2。xml(包含记录器和附加器) 模块B具有log4j2。xml 模块C具有log4j2。xml 在集成模块时,我必须手动将每个模块的log4j2.xml中的记录仪和应用程序复制粘贴到项目特定的log4j2.xml文件中。 为了避免复制粘贴,我希望XInclude包含多个

  • 我有一个python项目,有很多其他项目。py文件,它从它的子文件夹和txt文件导入,以及我想分享这个项目,但只有作为一个可执行文件,这样没有人可以看到代码或文本文件等。。。如果没有,有什么方法可以这样做吗?我怎样才能在不让任何人检查项目代码的情况下共享项目。py文件

  • 我正在使用由Visual Studio生成的gRPC服务项目。我有两个原型文件位于同一个“原型”目录中。我有一个原型,另一个原型文件有导入。它似乎找到了文件,但我无法引用来自另一个文件的任何消息。当我这样做时,我得到一个“blahblah”是未定义的错误。我已经拍摄了一些情况的屏幕截图。任何帮助都将不胜感激!