首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得proto以编译带有依赖项的proto?

如何获得proto以编译带有依赖项的proto?
EN

Stack Overflow用户
提问于 2021-12-09 19:31:36
回答 1查看 1.3K关注 0票数 3

我需要修复grpc服务,所以我想了解编译它们的逻辑。

在下面的示例中,我不明白为什么protoc不编译address.proto,因为它是由person.proto导入的。

没有构建错误,所以我不认为这是一个导入/命名问题。不幸的是,只生成了一个person_pb2.py .

代码语言:javascript
复制
// file: address.proto

syntax="proto3";

message Address {
    string city = 1;
    string road = 3;
    int32 roadNumber = 4;
}
代码语言:javascript
复制
// file: person.proto

syntax="proto3";

import "address.proto";

message Person {
  string name = 1;
  Address home = 3;
  Address work = 4;
}

构建命令:

代码语言:javascript
复制
python -m grpc_tools.protoc --proto_path ../protos --python_out=. person.proto
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-10 00:03:25

这是个合理的问题。

答案是,您只要求protoc编译person.proto (而且它确实要求您编译)。但是,生成的代码无法运行,因为person_pb2.py依赖于address_pb2

代码语言:javascript
复制
import address_pb2 as address__pb2

您需要有用于的所有协议缓冲区类型的Python源代码,这是您的代码所需要的。

代码语言:javascript
复制
python3 \
-m grpc_tools.protoc \
--proto_path=../protos \
--python_out=. \
person.proto address.proto

这个问题(正在解决)的一个很好的例子是谷歌所谓的著名类型(WKTs)

通过添加google.protobuf.Timestamp,您可以在Person中包括import "google/protobuf/timestamp.proto"

代码语言:javascript
复制
syntax="proto3";

import "google/protobuf/timestamp.proto";
import "address.proto";

message Person {
  string name = 1;
  Address home = 3;
  Address work = 4;
  google.protobuf.Timestamp timestamp = 5;
}

您可以在不更改protoc 的情况下使用,您的代码也可以工作。

这是因为谷歌将WKTs、捆绑在grpcio-tool中生成grpcio-tool代码。与任何其他源代码一样,do需要导入谷歌提供的Python源代码才能使用代码。

要做到这一点,你必须

main.py

代码语言:javascript
复制
import address_pb2
import person_pb2

from google.protobuf.timestamp_pb2 import Timestamp

这些文件在哪里?

就我而言:

代码语言:javascript
复制
lib/python3.8/site-packages/grpc_tools/_proto/google/protobuf/timestamp.proto

和:

代码语言:javascript
复制
lib/python3.8/site-packages/google/protobuf/timestamp_pb2.py

注意事项 Google捆绑生成的源代码是很方便的,但这并不是必需的,它会产生两个潜在的问题。

  1. timestamp.proto是真理的源泉,我们必须假定google/protobuf/timestamp_pb2.py是从它生成的。
  2. 如果我们是proto开发人员,我们需要为所有语言生成源代码,我们的proto开发人员在每次更新原型时都可以使用这些语言。

由于这些原因,一般(!)开发人员只提供原型,不包括生成的源代码,并假设您能够将proto插入到protoc中,并自己生成完美的传真。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70295689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档