8

zmq ipcソケットを介して既存のdictを送信しようとしています。このコードで文字列を送信できますが、dictオブジェクトを送信できません。

import zmq, datetime

d = {0: ('356612022462768', 'EVENT', 0, '2012-12-26 15:50:16', -20.22216, -70.13723, 6.44, 134.0, 1, 2, '18743230', datetime.datetime(2013, 2, 10, 9, 6, 2, 362734))}

if __name__ == "__main__":
    context = zmq.Context()
    publisher = context.socket(zmq.PUB)
    publisher.connect("ipc://shared")
    while True:
        publisher.send( d )
        time.sleep( 1 )

TypeError: {0: ('356612022462768', 'EVENT', 0, '2012-12-26 15:50:16', 
           -20.22216, -70.13723, 6.44, 134.0, 1, 2, '18743230', 
           datetime.datetime(2013, 2, 10, 9, 6, 2, 362734))} 
does not provide a buffer interface.

どうやってやるの?

4

2 に答える 2

11

そのままの状態で、ZeroMqを介して文字列またはバイト配列を送信することのみが可能です。それ以外のものは、ネットワーク上で転送するためにZeroMqに渡す前にシリアル化する必要があります。

プロトコルバッファ、JSON、メッセージパックなど、シリアル化には好きなものを使用できます。すべての受信者は、同じプロトコルを使用してデータを逆シリアル化できる必要があることに注意してください。

さまざまなシリアル化手法(numpy配列を含む)をpyzmqと組み合わせて使用​​する方法の例をここで見つけることができます。それらはpyzmqソースの一部です。

于 2013-02-10T12:59:30.247 に答える
7

ユースケースによっては、おそらく JSON にデータをシリアル化する必要があります。そのまま送信することはできません。文字列表現が必要になります

import json
myjson = json.dumps(d)

ただし、datetime オブジェクトを単純に json に変換することはできないため、個別に処理する必要があります。この投稿は、Python と JavaScript の間の JSON datetimeに役立ちます。

于 2013-02-10T13:03:48.193 に答える