在阅读这个相当长的问题之前,我提出了一个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)
我的本地项目目录包含三个。原型文件:
google/api/annotations。协议
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。原型
这将编译示例。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。原型不幸的是,我在这一点上遇到了一个错误:
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
在google/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
,如何解决?
试试这个:pip install googleapis-Common-pro s
。我遇到了同样的错误,并使用这种方法解决了它。
当我尝试和你一样的事情时,我想出了一个可能的解决方案,使用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处理了这个问题,但我在生成的类中找不到任何证据。 我可能在这里找到了答案,但