关于协议缓冲区:Python protobuf gRPC生成不存在的依赖项

Python protobuf gRPC generates a dependency that doesn't exist

我正在尝试通过以下方式为我的python代码创建gRPC绑定:

1
python -m grpc_tools.protoc -I $(pwd)/protos --python_out=./fino/pb2 --grpc_python_out=./fino/pb2 -I=$GOPATH/src -I=$GOPATH/src/github.com/gogo/protobuf/protobuf $(pwd)/protos/*

但是生成的文件具有不存在的依赖关系:

1
from github.com.gogo.protobuf.gogoproto import gogo_pb2 as github_dot_com_dot_gogo_dot_protobuf_dot_gogoproto_dot_gogo__pb2

稍后用于:

1
2
3
4
5
6
7
8
9
10
DESCRIPTOR = _descriptor.FileDescriptor(
  name='oracle.proto',
  package='oracle',
  syntax='proto2',
  serialized_pb=_b('\
\\x0coracle.proto\\x12\\x06oracle\\x1a-github.com/gogo/protobuf/gogoproto/gogo.proto\\x1a\\x1fgoogle/protobuf/timestamp.proto\\x1a\\x1bgoogle/protobuf/empty.proto\\x1a\\x0btypes.proto":\
\\x0b\\x41\\x63\\x63ountList\\x12+\
\\x08\\x61\\x63\\x63ounts\\x18\\x01 \\x03(\\x0b...'
)
  ,
  dependencies=[github_dot_com_dot_gogo_dot_protobuf_dot_gogoproto_dot_gogo__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,types__pb2.DESCRIPTOR,])

很显然,我无法运行此代码。尝试删除不存在的导入后:

1
2
3
TypeError: Couldn't build proto file into descriptor pool!
Invalid proto descriptor for file"oracle.proto":
  oracle.proto: Import"github.com/gogo/protobuf/gogoproto/gogo.proto" has not been loaded.

我尝试添加

1
--include_imports --descriptor_set_out=$(pwd)/protos/all.proto

但是我不确定如何将其添加到我的python文件中。我想要的只是我的python代码库中的独立描述。

EDIT1:
示例文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
syntax ="proto2";
package etcdserverpb;

import"github.com/gogo/protobuf/gogoproto/gogo.proto";

option (gogoproto.marshaler_all) = true;
option (gogoproto.sizer_all) = true;
option (gogoproto.unmarshaler_all) = true;
option (gogoproto.goproto_getters_all) = false;

message Request {
    optional uint64 ID         =  1 [(gogoproto.nullable) = false];
    optional string Method     =  2 [(gogoproto.nullable) = false];
    optional string Path       =  3 [(gogoproto.nullable) = false];
    optional string Val        =  4 [(gogoproto.nullable) = false];
    optional bool   Dir        =  5 [(gogoproto.nullable) = false];
    optional string PrevValue  =  6 [(gogoproto.nullable) = false];
    optional uint64 PrevIndex  =  7 [(gogoproto.nullable) = false];
    optional bool   PrevExist  =  8 [(gogoproto.nullable) = true];
    optional int64  Expiration =  9 [(gogoproto.nullable) = false];
    optional bool   Wait       = 10 [(gogoproto.nullable) = false];
    optional uint64 Since      = 11 [(gogoproto.nullable) = false];
    optional bool   Recursive  = 12 [(gogoproto.nullable) = false];
    optional bool   Sorted     = 13 [(gogoproto.nullable) = false];
    optional bool   Quorum     = 14 [(gogoproto.nullable) = false];
    optional int64  Time       = 15 [(gogoproto.nullable) = false];
    optional bool   Stream     = 16 [(gogoproto.nullable) = false];
    optional bool   Refresh    = 17 [(gogoproto.nullable) = true];
}

message Metadata {
    optional uint64 NodeID    = 1 [(gogoproto.nullable) = false];
    optional uint64 ClusterID = 2 [(gogoproto.nullable) = false];
}

这是https://github.com/gogo/protobuf/issues/376

的续篇


我知道这是一个老问题,但我想我可以解决。我为解决该问题所做的事情:

  • github.com/gogo/protobuf/gogoproto/gogo.proto文件下载到您的$(pwd)/protos文件夹中;将文件命名为gogo.proto
  • 将包含从import"github.com/gogo/protobuf/gogoproto/gogo.proto";更改为import"gogo.proto";
  • 更改命令以显式使用原始文件:python -m grpc_tools.protoc -I $(pwd)/protos --python_out=./fino/pb2 --grpc_python_out=./fino/pb2 -I=$GOPATH/src -I=$GOPATH/src/github.com/gogo/protobuf/protobuf $(pwd)/protos/gogo.proto $(pwd)/protos/metadata.proto(假设您将示例原始文件命名为metadata.proto)。