在阅读这个相当长的问题之前,我提出了一个错误https://github.com/GoogleCloudPlatform/python-docs-samples/issues/1103。
Proto Packages and Name Resolution的文档说明
您可以通过导入其他 .proto 文件中的定义来使用它们。要导入另一个 .proto 的定义,您需要在文件顶部添加一个 import 语句。
我example.proto
依赖annotations.proto将HTTP/JSON 转码为 gRPC。这是一个简单的示例,但请注意我使用来自googleapis/google/api Git存储库的导入路径(即google/api/annotations.proto
):
syntax = "proto3";
import "google/api/annotations.proto";
message MyExample {
// Message definition here.
}
注意,annotations.proto依赖于http.proto - 它们是同一个包中的兄弟姐妹(googleapis/google/api)
我的本地项目目录包含三个 .proto 文件:
example.proto
google/api/annotations.proto
google/api/http.proto
...或作为一棵树:
|____google
| |____api
| | |____annotations.proto
| | |____http.proto
|____example.proto
目标(或“out”)目录也被添加,准备接收生成的 python 文件:
|____generated_pb2
| |____google
| | |____api
我完整的项目目录结构是:
example.proto
google/api/annotations.proto
google/api/http.proto
generated_pb2/google/api
...或作为一棵树:
|____example.proto
|____google
| |____api
| | |____annotations.proto
| | |____http.proto
|____generated_pb2
| |____google
| | |____api
有了这个,我可以编译我的原型(为可读性添加了格式):
python -m grpc_tools.protoc
--python_out=generated_pb2
--grpc_python_out=generated_pb2
-I ~/protoc/include/google/protobuf
-I /google/api
example.proto
打破这个:
generated_pb2
- 生成的 python 文件和 gprc 文件的目的地。~/protoc/include/google/protobuf
- 由于annotations.proto取决于google/protobuf/descriptor.proto,因此需要使用 protoc 二进制文件附带的常见 protos 的位置。google/api
- 位置annotations.proto
和http.proto
这编译example.proto
给:
generated_pb2/example_pb2.py
generated_pb2/example_pb2_gprc.py
但是,第一行generated_pb2/example_pb2.py
导入生成的文件annotations.proto
:
from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
该文件不存在。没问题,我annotations.proto
单独编译:
python -m grpc_tools.protoc
--python_out=generated_pb2/google/api
--grpc_python_out=generated_pb2/google/api
-I ~/protoc/include/google/protobuf
-I google/api annotations.proto
打破这个:
generated_pb2/google/api
- 生成的 python 文件和 gprc 文件的目的地。~/protoc/include/google/protobuf
- 由于annotations.proto取决于google/protobuf/descriptor.proto,因此需要使用 protoc 二进制文件附带的常见 protos 的位置。google/api
-http.proto
取决于哪个位置annotations.proto
。
不幸的是,此时我收到一个错误:
google/api/http.proto: File not found.
annotations.proto: Import "google/api/http.proto" was not found or had errors.
annotations.proto:30:3: "HttpRule" is not defined.
我想这是因为annotations.proto
寻找http.proto
in google/api
:
syntax = "proto3";
package google.api;
import "google/api/http.proto";
import "google/protobuf/descriptor.proto";
然而,目前尚不清楚如何解决这种依赖关系。 protoc --help
记录-I
标志:
-IPATH, --proto_path=PATH Specify the directory in which to search for
imports. May be specified multiple times;
directories will be searched in order. If not
given, the current working directory is used.
如何解决取决于http.proto
哪个annotations.proto
?