我需要修复grpc服务,所以我想了解编译它们的逻辑。
在下面的示例中,我不明白为什么protoc不编译address.proto,因为它是由person.proto导入的。
没有构建错误,所以我不认为这是一个导入/命名问题。不幸的是,只生成了一个person_pb2.py .
// file: address.proto
syntax="proto3";
message Address {
string city = 1;
string road = 3;
int32 roadNumber = 4;
}// file: person.proto
syntax="proto3";
import "address.proto";
message Person {
string name = 1;
Address home = 3;
Address work = 4;
}构建命令:
python -m grpc_tools.protoc --proto_path ../protos --python_out=. person.proto发布于 2021-12-10 00:03:25
这是个合理的问题。
答案是,您只要求protoc编译person.proto (而且它确实要求您编译)。但是,生成的代码无法运行,因为person_pb2.py依赖于address_pb2
import address_pb2 as address__pb2您需要有用于的所有协议缓冲区类型的Python源代码,这是您的代码所需要的。
python3 \
-m grpc_tools.protoc \
--proto_path=../protos \
--python_out=. \
person.proto address.proto这个问题(正在解决)的一个很好的例子是谷歌所谓的著名类型(WKTs)
通过添加google.protobuf.Timestamp,您可以在Person中包括import "google/protobuf/timestamp.proto"
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
import address_pb2
import person_pb2
from google.protobuf.timestamp_pb2 import Timestamp这些文件在哪里?
就我而言:
lib/python3.8/site-packages/grpc_tools/_proto/google/protobuf/timestamp.proto和:
lib/python3.8/site-packages/google/protobuf/timestamp_pb2.py注意事项 Google捆绑生成的源代码是很方便的,但这并不是必需的,它会产生两个潜在的问题。
timestamp.proto是真理的源泉,我们必须假定google/protobuf/timestamp_pb2.py是从它生成的。由于这些原因,一般(!)开发人员只提供原型,不包括生成的源代码,并假设您能够将proto插入到protoc中,并自己生成完美的传真。
https://stackoverflow.com/questions/70295689
复制相似问题