grpc字段的非法线路类型Message.Field .PeopleRequest.ages:2(0预期))

时间:2017-01-24 01:48:53

标签: python protocol-buffers grpc

这是我的原型文件:

syntax = "proto3";

package grpcClient;

service GrpcClient {
  rpc GetPeople(PeopleRequest) returns (PeopleResponse) {}
}
message PeopleRequest {
  repeated string names = 1; // ex: ['jack', 'marie']
  repeated int32 ages = 2; // ex: [18, 24]
}
message PeopleResponse {
  repeated Person people = 1;
}
message Person {
  string name = 1;
  int32 age = 2;
}

这是python存根结构:

from . import grpcClient_pb2
class GrpcClient:
    def __init__(self):
        server_url = "http://my_url:5001"
        secure_channel = make_secure_channel(server_url)
        self.__stub = grpcClient_pb2.GrpcClientStub(secure_channel)

    def get_people(self, **kwargs):
        people_request = grpcClient_pb2.PeopleRequest(**kwargs)
        # your test example
        try:
            serialized_people_request = grpcClient_pb2.PeopleRequest.SerializeToString(people_request)
        except Exception as e:
            print(e)
        else:
            print('Serialized to binary of type {} and length {}'.format(type(serialized_people_request), len(serialized_people_request)))
        return self.__stub.GetPeople(people_request) # this throw an error

这是我的grpc电话:

    grpcClient = GrpcClient()
grpcClient.get_people({ 'names': ['daniel', 'jack'] }) # this is OK
grpcClient.get_people({ 'names': ['daniel', 'jack'], 'ages': [18, 22] }) # this throws

我使用 Python 3.6 ,我的pip包版本是:

grpcio            1.0.4      
grpcio-tools      1.0.4
pip               9.0.1
protobuf          3.1.0.post1

我使用此命令生成grpcClient_pb2.pygrpcClient_pb2_grpc.py

python -m grpc.tools.protoc -I./ --python_out=./ --grpc_python_out=./ ./grpcClient.proto

注意:这是自动生成的python代码:

_descriptor.FieldDescriptor(
      name='names', full_name='PeopleRequest.names', index=0,
      number=1, type=9, cpp_type=9, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
_descriptor.FieldDescriptor(
      name='ages', full_name='PeopleRequest.ages', index=1,
      number=2, type=5, cpp_type=1, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

我认为没有足够的信息来诊断问题。你能提供整个原型文件吗?我假设它包含GetPeoples服务。

您还可以提供整个客户端计划吗?使用gRPC,导入可能会让您感到困惑,因为您需要从 grpc包和生成的<your_proto>_pb2_grpc包中导入内容。目前尚不清楚这些grpc.PeopleRequest中的哪一个引用。

我试图用以下名为test.proto的原型文件填写缺失的部分:

syntax = "proto3";

service MyService {
  rpc GetPeoples(PeopleRequest) returns (PeopleReply) {}
}

message PeopleRequest {
  repeated string names = 1; // ex: ['jack', 'marie']
  repeated int32 ages = 2; // ex: [1, 2]
}

message PeopleReply {
}

以下客户端,对我有用:

from __future__ import print_function

import grpc

import test_pb2
import test_pb2_grpc


def run():
  channel = grpc.insecure_channel('localhost:50051')
  stub = test_pb2_grpc.MyServiceStub(channel)
  obj = test_pb2.PeopleRequest(
      names=['daniel'],
      ages=[32])
  print(obj)    # Ok, no error when building the object
  stub.GetPeoples(obj) # ERROR Illegal wire type for field ages: 2 (0 expected))

if __name__ == '__main__':
  run()

这就是我要构建的内容,per the Python quickstart

$ virtualenv venv
$ source venv/bin/activate
(venv) $ python --version
Python 2.7.6
(venv) $ pip install grpcio
(venv) $ pip install cython
(venv) $ pip install grpcio-tools
(venv) $ pip freeze
Cython==0.25.2
argparse==1.2.1
coverage==4.3.4
enum34==1.1.6
futures==3.0.5
grpcio==1.0.4
grpcio-tools==1.0.4
protobuf==3.1.0.post1
six==1.10.0
wheel==0.29.0
wsgiref==0.1.2
(venv) $ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. test.proto
祝你好运!

答案 1 :(得分:0)

短篇小说:我的服务器是用node.js编写的,并且: rm -rf node_modules npm i 为我解决了这个问题。

长篇故事:无论我的客户端连接的服务器是什么(我有一个本地和远程node.js服务器运行测试),我的客户端都会抛出这两种情况。这就是我在客户端代码中查找错误的原因,而不是在服务器端。此外,服务器从未记录任何内容,只有客户端抛出错误。

最后我在python中重新实现了服务器端,令人惊讶的是我的客户端在连接到python服务器时不会抛出。所以我开始怀疑我的node.js服务器出了问题,我终于完全重新安装了我的node.js服务器的 node_modules ,重启了,问题确实消失了。所以我得出结论,问题与 node_modules 中的某个包有关。