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
protobufはGoogleが提供するオープンソースシーケンス化フレームワークであり、XML、JSONのようなデータ表現言語であり、その最大の特徴はバイナリベースであるため、従来のXML表現よりも効率がはるかに短い.開発者は構造体に似たmessageを定義し、protobufのツールを通じて定義されたフォーマットをprotobufの受信ツールに転送し、受信ツールは自動的にクラスを生成し、転送が必要なときに直接このクラスをインポートし、キーフィールドを埋め、シーケンス化関数を通じてシーケンス化し、受信側はそれを逆シーケンス化し、データ転送を実現する.protobufはc++,java,pythonをサポートします.詳細については、リファレンスドキュメントを参照してください.
protobufのフォーマット定義は、ドキュメントを参照できます.ここでは、2つの簡単な実用的な例を挙げます.
message User {
required int32 age = 3;
}
protobufはデータ表現言語として、コードに書かれたstring、int 32など、独自のタイプがあり、required、optionalはこのフィールドが必須かどうかを表し、requiredを記入し、optionalを記入する必要はありません.次の1,2,3はシーケンス番号で、このフィールドの値ではありません.必須フィールドはプログラムに入力するか、デフォルト値を設定します.ProtobufのタイプとフォーマットについてはGoogle Language Guideを参照してください.User配列を定義して転送する場合は、次のように定義できます(キーワードrepreatedに注意):
message User {
required string password = 2;
optional string email = 4;
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 *
libs = CDLL("./libs.so")
user = User_pb2.User()#は、構築方法と同様である
user.password = 'xxxxxxxxx'
sContent = user.SerializeToString()#シーケンス化方法
libs.IPCExit()
私は大雑把に書いただけで、みんなはきっと一目でわかるに違いない.protobuf配列を転送すると、次のように書くことができます.
from ctypes import *
libs = CDLL("./libs.so")
users = User_pb2.Users()#は、構築方法と同様である
user.username = 'zhangpeng'
user.age = 23
このように簡単にaddメソッドを追加して、UserとUsersの違いに注意して、
これはもともとc++で実現されるものですが、関連するものが多く、直すのが面倒で、リスクがあり、pyで実現されるようになりましたが、cはpythonのシーケンス化よりも効率が高く、個人的にはpythonが接着剤のように見え、使いやすいと思います.何か問題があったら直接指摘してください.
転載先:https://blog.51cto.com/padden/441612