2017-01-24 11 views
1

Вот мой прото файл:КПГР Недопустимый тип провода для Message.Field .PeopleRequest.ages поля: 2 (0 ожидается))

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; 
} 

А вот питон окурок конструкция:

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 

и вот мой КПГР звонок:

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 и мой пип Packa версии GES являются:

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

Я генерировать grpcClient_pb2.py и grpcClient_pb2_grpc.py с помощью этой команды:

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

Примечание: А вот автоматически сгенерированный питон код:

_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), 

Большое спасибо за помощь!

ответ

0

Короткий рассказ: Мой сервер был написан в Node.js, а также: rm -rf node_modules npm i решить эту проблему для меня.

Длинная история: Кажется, что независимо от того, с каким сервером подключался мой клиент (у меня был локальный и удаленный сервер node.js, работающий для теста) в обоих случаях, когда мой клиент будет бросать. Вот почему я искал ошибку в клиентском коде, а не на стороне сервера. Более того, сервер никогда ничего не регистрировал, только клиент выбрал ошибку.

Наконец, я переопределял серверную часть в python, и, на удивление, мой клиент не бросался при подключении к серверу python. Поэтому я начал подозревать, что у моего узла node.js возникла проблема, я, наконец, полностью переустановил node_modules моего сервера node.js, перезапустил и действительно проблема исчезла.Поэтому я заключаю, что проблема связана с некоторым пакетом в node_modules.

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 

Удачи !

+0

Эй, большое спасибо за ваш тест. Я даю более подробную информацию об этом билете: https://github.com/grpc/grpc/issues/9439, ваш пример очень похож на мой код. Может быть, это разные версии python/grpc/protobuf ...? Я сейчас далеко от клавиатуры, я скоро продолжу расследование – Sulliwane

+0

вы могли бы сказать, какие версии вы используете (python/protobuf/grpcio), и как вы создаете test_pb2 и test_pb2_grpc? Спасибо – Sulliwane

+0

просто попробовал с python 3.5, бросая ту же ошибку. Мне интересны ваши импорт: '' 'import test_pb2, import test_pb2_grpc''', для меня' '' 'test_pb2_grpc''' имеет много дубликатов импорта вверху, что вызывает проблемы, поэтому я просто пропущу его и использую определение Stub также доступно в '' '' test_pb2'''''. – Sulliwane