3

在阅读这个相当长的问题之前,我提出了一个错误https://github.com/GoogleCloudPlatform/python-docs-samples/issues/1103

Proto Packages and Name Resolution的文档说明

您可以通过导入其他 .proto 文件中的定义来使用它们。要导入另一个 .proto 的定义,您需要在文件顶部添加一个 import 语句。

example.proto依赖annotations.protoHTTP/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 文件:

  1. example.proto
  2. google/api/annotations.proto
  3. 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.protohttp.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.protoin 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

4

2 回答 2

1

当我尝试和你做同样的事情时,我想出了一个可能的解决方案,使用Makefile来创建适当的文件。因为我是用python测试的,所以我安装了grpc python包并通过python使用protoc而不是直接使用它,但是输入和结果应该是一样的。

每个protoc调用中使用的通用 protobuf 标志:

GRPC_FLAGS := \
    -I. \
    -I/usr/local/include \
    -I$(GOPATH)/src \
    -I$(GOPATH)/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis

源生成

源代码特定标志:

CLIENT_FLAGS := \
    --proto_path=./protos \       <-- This is where my *.proto live
    --python_out=grpctest/client \
    --grpc_python_out=grpctest/client

调用protoc从您的 *.proto 生成项目特定协议

python3 -m grpc_tools.protoc $(CLIENT_FLAGS) $(GRPC_FLAGS) protos/*.proto

注释生成

注释特定标志:

CLIENT_GW_FLAGS := \
    --python_out=grpctest/client \
    --grpc_python_out=grpctest/client

调用protoc生成注解特定文件:

python3 -m grpc_tools.protoc $(CLIENT_GW_FLAGS) $(GRPC_FLAGS) google/api/annotations.proto
python3 -m grpc_tools.protoc $(CLIENT_GW_FLAGS) $(GRPC_FLAGS) google/api/http.proto

最终文件系统结构

├── client.py
├── config.yml
├── file
├── google
│   └── api
│       ├── __pycache__
│       ├── annotations_pb2.py
│       ├── annotations_pb2_grpc.py
│       ├── http_pb2.py
│       └── http_pb2_grpc.py
├── grpctest_pb2.py
└── grpctest_pb2_grpc.py
于 2018-03-28T14:33:45.217 回答
1

试试这个:pip install googleapis-common-protos。我遇到了同样的错误并使用这种方法解决了它。

于 2019-07-24T06:22:35.653 回答