2013-04-26 12 views
12

Qualcuno ha esperienza di comunicazione con i kernel IPython al di fuori di Python?Invio di messaggi da altre lingue a un kernel IPython

Se dovessi inviare messaggi da un'app Python a un kernel IPython, utilizzerei l'API zmq.kernelmanager. Ovviamente, dovrò ovviamente scrivere il mio gestore del kernel in un'altra lingua, ma non riesco a trovare le informazioni che sto cercando sui protocolli di messaggistica di basso livello.

Esiste una specifica ufficiale o un "cheat sheet" che documenta la struttura dei messaggi effettivi inviati oltre 0MQ? This page descrive un protocollo di livello superiore rispetto a quello che sto cercando ... Dovrò manualmente separare l'implementazione per trovare quello che voglio?

+0

C'è un post sul blog, che si collega a questa domanda, che descrive come implementare una http kernel ipython: // StackOverflow. it/questions/16240747/sending-messages-from-other-languages-to-an-ipython-kernel – dirceusemighini

+1

http://andrew.gibiansky.com/blog/ipython/ipython-kernels/ è ciò di cui parla @dirceusemighini. –

risposta

13

Questo è un documento che deve essere necessariamente presente, ma l'implementazione del protocollo wire è implementata in un single object, quindi non dovrebbe essere troppo difficile da trovare da lì. Lo message spec doc collegato include il contenuto a livello di applicazione di ciascun campo, ma non il modo in cui viene serializzato su zeromq. Supponendo di avere un messaggio, come descritto in quel documento, il formato del filo è piuttosto semplice. Si tratta di un messaggio concatenato zeromq di almeno sei parti:

  • Le parti principali del messaggio sono i zeromq identità di routing (zero-a-molti)
  • Questi sono seguiti da un messaggio delimitatore, con il byte <IDS|MSG>
  • il HMAC digest del messaggio (una stringa vuota '' se l'autenticazione è disabilitata)
  • header
  • parent_header
  • metadata
  • content

header, parent_header, metadata e content sono tutti descritti nel documento di messaggistica - questi sono dizionari e serializzato di byte con tutto ciò che la serializzazione è attualmente utilizzata. L'impostazione predefinita in IPython è JSON con codifica utf8, ma la serializzazione arbitraria è consentita (msgpack è il più comune non predefinito). Non ancora descritto nei documenti è il digest, utilizzato per l'autenticazione. Questo è un MD5 HMAC Digest del messaggio. La chiave per il digest si trova nel campo key del file di connessione. Il "messaggio" utilizzato dal digest HMAC è la concatenazione dei byte dell'intestazione serializzata, parent_header, metadati e contenuto, nello stesso ordine inviato sul filo.

È possibile disattivare il messaggio firma specificando il valore di configurazione

Session.key = '' 

alle parti IPython relative del codice, nel qual caso il campo digest sarà sempre una stringa vuota ''. Ti consiglio di farlo mentre inizi, in modo che tu possa prima capire le parti più interessanti dell'implementazione.

Ecco una richiesta di esecuzione di esempio e la sua risposta effettivamente inviata da IPython.

La richiesta:

[ 
    <IDS|MSG> 
    6ea6b213262402cc1ad3c1d3e342a9f6 
    {"date":"2013-04-27T23:22:13.522049","username":"minrk","session":"5b03b89a-93c9-4113-bb85-17ba57233711","msg_id":"c6d0f85e-fc25-4f1e-84e1-3d706b615393","msg_type":"execute_request"} 
    {} 
    {} 
    {"user_variables":[],"code":"1\n","silent":false,"allow_stdin":true,"store_history":true,"user_expressions":{}} 
] 

e la sua risposta:

[ 
    5b03b89a-93c9-4113-bb85-17ba57233711 
    <IDS|MSG> 
    47d1052f6e8f333d18480938ca91719b 
    {"date":"2013-04-27T23:22:13.528239","username":"kernel","session":"d7eb303b-d2d0-4723-aef2-738545a8da11","msg_id":"9ed1d332-398c-4132-b203-1e7bf8fed712","msg_type":"execute_reply"} 
    {"date":"2013-04-27T23:22:13.522049","username":"minrk","session":"5b03b89a-93c9-4113-bb85-17ba57233711","msg_id":"c6d0f85e-fc25-4f1e-84e1-3d706b615393","msg_type":"execute_request"} 
    {"dependencies_met":true,"engine":"645fb29f-37ab-40c9-bc01-b7fbfe3c2112","status":"ok","started":"2013-04-27T23:22:13.524114"} 
    {"status":"ok","execution_count":2,"user_variables":{},"payload":[],"user_expressions":{}} 
] 
Problemi correlati