2017-01-24 3 views
1

は私のプロトファイルです:grpc不正なワイヤータイプ: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; 
} 

そして、ここでの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と私のピップpacka GESのバージョンは次のとおりです。

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 

注:

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

多くのおかげで:ここには、自動生成されたPythonのコードですあなたは助けてくれます!

答えて

0

短編小説:私のサーバーは、Node.jsの中に書かれていた、と: rm -rf node_modules npm i は私のために問題を解決しました。

は長い物語:私のクライアントが接続されたサーバは、私のクライアントは投げるだろう、両方の場合には(私はローカルおよびテストのために実行しているリモートのNode.jsサーバーを持っていた)どんなことが表示されます。だからこそ、私はクライアント側のコードでエラーを探しましたが、サーバー側では探していませんでした。さらに、サーバーは何もログに記録せず、クライアントだけがエラーをスローしました。

最後に、私はPythonでサーバー側を再実装しました。驚いたことに、私のクライアントはPythonサーバーに接続するときにスローしません。だから、node.jsサーバーに問題があると思われたので、私のnode.jsサーバーのnode_modulesを完全に再インストールして再起動しましたが、問題は消えました。だから問題は、いくつかのパッケージに関連していると結論するnode_modules

1

問題を診断するのに十分な情報がないと思います。 protoファイル全体を提供してください。私はそれがGetPeoplesサービスを含んでいると仮定しています。

クライアントプログラム全体を提供することもできますか? gRPCでは、からgrpcパッケージと生成された<your_proto>_pb2_grpcパッケージの両方をインポートする必要があるため、インポートが混乱する可能性があります。これらのうちどれが参照されているかは不明です。

私は 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で同じエラーを投げてみました。私はあなたの輸入に興味があります: '' 'test_pb2、import test_pb2_grpc'''、私には' 'test_pb2_grpc'''に問題の原因となる重複インポートがたくさんあるので、それをスキップして使用しますStubの定義は '' '' 'test_pb2'''''でも利用できます。 – Sulliwane

関連する問題