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

协议缓冲区导入解析

太叔凌龙
2023-03-14

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

原型包和名称解析的留档状态

您可以使用其他定义。通过导入原始文件。导入另一个。在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)

我的本地项目目录包含三个。原型文件:

  1. <代码>示例。协议
  2. google/api/annotations。协议
  3. google/api/http。协议

...或作为一棵树:

|____google
| |____api
| | |____annotations.proto
| | |____http.proto
|____example.proto

还将添加目标(或“out”)目录,以便接收生成的python文件:

|____generated_pb2
| |____google
| | |____api

我的完整项目目录结构如下:

  • <代码>示例。协议
  • google/api/annotations。协议
  • google/api/html" target="_blank">http。协议
  • 生成的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

对此进行分解:

  • 生成的\u pb2-生成的python文件和gprc文件的目标
  • <代码>~/protoc/include/google/protobuf-protoc二进制文件附带的常见protos的位置,自注释以来需要。proto依赖于google/protobuf/descriptor。原型
  • google/api-注释的位置。proto和http。协议

这将编译示例。proto给出:

  • generated_pb2/example_pb2.py
  • generated_pb2/example_pb2_gprc.py

然而,的第一行生成了\u pb2/example\u pb2。py导入为注释生成的文件。协议:

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\u pb2/google/api-生成的python文件和gprc文件的目标
  • <代码>~/protoc/include/google/protobuf-protoc二进制文件附带的常见protos的位置,自注释以来需要。proto依赖于google/protobuf/descriptor。原型
  • 谷歌/api-http的位置。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.protogoogle/api中查找http.proto

syntax = "proto3";
package google.api;

import "google/api/http.proto";
import "google/protobuf/descriptor.proto";

然而,目前尚不清楚如何解决此依赖关系。协议--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,如何解决?

共有2个答案

淳于知
2023-03-14

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

柯国安
2023-03-14

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

每个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

调用协议从您的*. 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
 类似资料:
  • 问题内容: 我有一个文件定义,需要导入,因为我使用“ 自定义选项”。 因此,在我的文件中,我这样做: 由于我的文件没有编译有关该依赖项的抱怨,因此我得到了描述符文件的副本,将其放置在与我的原型文件相同的目录中。 这解决了问题,但我不认为这是正确的方法。现在,将gets与我的文件一起编译,从而在运行时进行了2次编译: 文件附带的那个 与我的文件一起编译的那个 我认为应该以某种方式使用该选项,但不能完

  • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

  • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa

  • 其中需要将路径设置为协议,以获取导入标准协议缓冲区(protobuf),如清空。proto和时间戳。在Windows和Dart中的proto? 运行协议时: protoc——dart\u out=grpc:lib/src/protos/generated-Iprotos-protos/organization。proto—plugin=protoc gen dart=D:\Users\Samuel

  • 两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?

  • 我正在使用Google Protocol Buffers向服务器发送消息。我对如何发送图像与如何接收图像感到困惑。有关详细信息,请参阅下面的代码,但我的问题是: 我需要base64_decode从未经过base64编码的返回字符串吗,因为它是使用char*和size发送的?也许Google Protocol Buffers处理了这个问题,但我在生成的类中找不到任何证据。 我可能在这里找到了答案,但