2013-02-10 8 views
7

Próbuję wysłać istniejący dict przez zmq gniazda IPC mogę wysłać ciąg z tego kodu, ale nie mogę wysłać obiekt DICT
Wysyłanie istniejący dict przez zmq IPC

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. 

Jak mogę to zrobić?

Odpowiedz

9

Możliwe jest tylko wysyłanie ciągów znaków lub bajtów za pomocą ZeroMq, natychmiast po wyjęciu z pudełka. Cokolwiek innego trzeba serializować przed przekazaniem go do ZeroMq do przeniesienia na drucie.

Możesz użyć dowolnej wersji serializacji, na przykład Bufory protokołów, JSON lub Message Pack. Należy zauważyć, że wszyscy odbiorcy muszą mieć możliwość deserializacji danych przy użyciu tego samego protokołu.

Można znaleźć przykłady użycia różnych technik serializacji (w tym tablicy numpy) w połączeniu z pyzmq here. Są częścią pyzmq source.

6

Musisz serializować dane, prawdopodobnie do JSON w zależności od przypadku użycia. nie można wysłać go jak to jest, trzeba mieć reprezentację ciąg

import json 
myjson = json.dumps(d) 

ale obiekt datetime nie może po prostu być konwertowane do formatu JSON, więc będziesz mieć do czynienia z tym oddzielnie, ten post będzie pomóc to: JSON datetime between Python and JavaScript