2013-04-26 11 views
12

Hat jemand Erfahrung mit der Kommunikation mit IPython-Kernel außerhalb von Python?Senden von Nachrichten aus anderen Sprachen an einen IPython-Kernel

Wenn ich versuche, Nachrichten von einer Python-App an einen IPython-Kernel zu senden, würde ich die zmq.kernelmanager-API verwenden. So wie es ist, muss ich natürlich meinen eigenen Kernel-Manager in einer anderen Sprache schreiben, aber ich kann die gesuchten Informationen über die Low-Level-Messaging-Protokolle nicht finden.

Gibt es eine offizielle Spezifikation oder einen "Spickzettel", der die Struktur der tatsächlichen Nachrichten dokumentiert, die über 0MQ gesendet werden? This page beschreibt ein Protokoll auf höherer Ebene als das, wonach ich suche ... Muss ich die Implementierung manuell auseinander ziehen, um zu finden, was ich will?

+0

Es gibt einen Blog-Post, die zu dieser Frage verknüpft, die beschreibt, wie eine ipython kernel http implementieren: // Stackoverflow. com/questions/16240747/sending-messages-from-other-sprachen-zu-einem-ipython-kernel – dirceusemighini

+1

http://andrew.gibiansky.com/blog/ipython/ipython-kernels/ ist worüber @dirceusemighini spricht. –

Antwort

13

Dies ist ein Dokument, das verzweifelt existieren muss, aber die Implementierung des Wire-Protokolls ist in einem single object implementiert, so dass es nicht zu schwer sein sollte, von dort zu grok. Die message spec doc, die Sie verlinkt haben, deckt den Inhalt der Anwendungsebene jedes Feldes ab, aber nicht, wie es tatsächlich über zeromq serialisiert wird. Angenommen, Sie haben eine Nachricht, wie in diesem Dokument beschrieben, ist das Kabelformat ziemlich einfach. Es ist ein mehrteiliger zeromq Nachricht von mindestens sechs Teilen:

  • Die führenden Nachrichtenteile sind die zeromq Routing-Identitäten (Null-to-many)
  • diese durch eine Delimiter-Nachricht gefolgt werden, wobei die Bytes <IDS|MSG>
  • die HMAC digest der Nachricht (eine leere Zeichenfolge, wenn die Authentifizierung '' deaktiviert)
  • header
  • parent_header
  • metadata
  • content

header, parent_header, metadata und content alle sind in der Messaging-doc beschrieben - diese Wörterbücher sind, und serialisiert Bytes mit dem, was Serialisierung zurzeit verwendet wird. Der Standard in IPython ist utf8-codiertes JSON, aber willkürliche Serialisierung ist erlaubt (msgpack ist der häufigste Nicht-Standard). Noch nicht in der Dokumentation beschrieben ist die digest, die für die Authentifizierung verwendet wird. Dies ist ein MD5 HMAC Digest der Nachricht. Der Schlüssel für den Digest befindet sich im Feld key der Verbindungsdatei. Die vom HMAC-Digest verwendete "Nachricht" ist die Verkettung der Bytes des serialisierten Headers, des übergeordneten Headers, der Metadaten und des Inhalts in derselben Reihenfolge, die über die Verbindung gesendet wird.

Sie können durch die Angabe des Konfigurationswertes Nachrichtensignierung deaktivieren

Session.key = '' 

die IPython bezogenen Teile des Codes, in welchem ​​Fall das Digest Feld wird immer '' eine leere Zeichenfolge sein. Ich würde empfehlen, dies zu tun, während Sie beginnen, damit Sie die interessanteren Teile der Implementierung zuerst ausarbeiten können.

Hier sind eine Beispiel-Ausführungsanforderung und ihre Antwort tatsächlich von IPython gesendet.

Die Anfrage:

[ 
    <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":{}} 
] 

und seine Antwort:

[ 
    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":{}} 
] 
Verwandte Themen