pythonはダイナミックリンクライブラリを呼び出してprotobufデータを転送します.

3662 ワード

protobufとは
protobufはGoogleが提供するオープンソースシーケンス化フレームワークであり、XML、JSONのようなデータ表現言語であり、その最大の特徴はバイナリベースであるため、従来のXML表現よりも効率がはるかに短い.開発者は構造体に似たmessageを定義し、protobufのツールを通じて定義されたフォーマットをprotobufの受信ツールに転送し、受信ツールは自動的にクラスを生成し、転送が必要なときに直接このクラスをインポートし、キーフィールドを埋め、シーケンス化関数を通じてシーケンス化し、受信側はそれを逆シーケンス化し、データ転送を実現する.protobufはc++,java,pythonをサポートします.詳細については、リファレンスドキュメントを参照してください.
protobufのフォーマット定義は、ドキュメントを参照できます.ここでは、2つの簡単な実用的な例を挙げます.
 
message User {  
  •   required string username = 1;
  • required string password = 2  

  •   required int32 age = 3;  
  •   optional string email = 4;  

  •   }  
  •  

  • protobufはデータ表現言語として、コードに書かれたstring、int 32など、独自のタイプがあり、required、optionalはこのフィールドが必須かどうかを表し、requiredを記入し、optionalを記入する必要はありません.次の1,2,3はシーケンス番号で、このフィールドの値ではありません.必須フィールドはプログラムに入力するか、デフォルト値を設定します.ProtobufのタイプとフォーマットについてはGoogle Language Guideを参照してください.User配列を定義して転送する場合は、次のように定義できます(キーワードrepreatedに注意):
    message User {  
  •   required string username = 1;  

  •   required string password = 2;  
  •   required int32 age = 3;  

  •   optional string email = 4;  
  •   }  

  •  
  • message Users {  

  •   repeated User user = 1;  
  •   }  

  •  
    フォーマットを定義した後(messageファイルは.protoで終わります)、protobufのlinuxの下のmessage生成ツールをインストールすることができます.具体的にはGoogleの公式ダウンロードに行くことができます.これはオープンソースプロジェクトで、インストールするときはまだそのステップです.configure,make,make installは,gccコンパイラが必要であることを前提として簡単である.次にprotobufのクラスライブラリをインストールします.ここではpython 2とします.5の例では、クラスライブラリ、protobuf-2.3.0-py 2をインストールする必要があります.5.egg、eggファイルはc++に類似する.soまたはjavaのjarファイルは、ライブラリファイルであり、呼び出しを提供し、eggファイルをインストールする最も簡単な方法はeasy_をインストールすることです.Install、アンインストールしたくない場合はeggファイルのパスを指定しますが、eggファイルをロードするにはpythonのライブラリsetuptools-0.6 c 9-py 2が必要です.5.egg、そうすることができます.
    export PYTHONPATH=$SRC_DIR/protobuf-2.3.0-py2.5.egg:$SRC_DIR/setuptools-0.6c9-py2.5.egg
    これらのライブラリファイルをpythonのsysにインポートすることを目的としています.pathパスでは、ロード時にもロードできます.これにより、プログラムに直接import googleをロードできます.protobuf、または他のprotobufのライブラリをインポートしても間違いはありません.c++とjavaは詳しく話しません.大同小異です. 
    インストールが完了したら、protoc-I=$SRC_を実行します.DIR --python_out=$DST_DIR $SRC_DIR/User.protoエラーが提示されていなければ出力ディレクトリの下にXXX_が生成されますpb2.pyファイル(私が上で定義したようにUser_pb 2.pyを生成します)、これが生成されたクラスで、使用するときに直接導入すればいいです(1つのディレクトリの下に置くか、sys.pathをインポートします).
    python呼び出しダイナミックリンクライブラリについて、pythonはライブラリ、ctypes、このライブラリ2.4および2.4を提供していません.使用するときはバージョンに注意して、次のように呼び出します.
    from ctypes import *  
  • import User_pb2
  •  
  •  

  • libs = CDLL("./libs.so")  
  • libs.Init()  

  • user = User_pb2.User()#は、構築方法と同様である
  • user.username = 'zhangpeng' 

  • user.password = 'xxxxxxxxx' 
  • user.age = 23 

  • sContent = user.SerializeToString()#シーケンス化方法
  • libs.Send(c_char_p(sContent), c_uint(len(sContent)))  

  • libs.IPCExit() 
    私は大雑把に書いただけで、みんなはきっと一目でわかるに違いない.protobuf配列を転送すると、次のように書くことができます.
    from ctypes import *    
  • import Users_pb2   

  •  
  •  

  • libs = CDLL("./libs.so")    
  • libs.Init()    

  • users = User_pb2.Users()#は、構築方法と同様である
  • user = users.add()    

  • user.username = 'zhangpeng'   
  • user.password = 'xxxxxxxxx'   

  • user.age = 23   
  • sContent = users.SerializeToString()#シーケンス化方法
  • libs.Send(c_char_(sContent), c_uint(len(sContent)))    
  • libs.IPCExit()  

  • このように簡単にaddメソッドを追加して、UserとUsersの違いに注意して、
    これはもともとc++で実現されるものですが、関連するものが多く、直すのが面倒で、リスクがあり、pyで実現されるようになりましたが、cはpythonのシーケンス化よりも効率が高く、個人的にはpythonが接着剤のように見え、使いやすいと思います.何か問題があったら直接指摘してください.
    転載先:https://blog.51cto.com/padden/441612