2016-05-11 5 views
0

Wenn ich versuche, mit seinem Jupyter-Client in Python-Code zu verbinden, gebe ich ein Problem.Kann Ergebnis der Rückgabe nicht erhalten Ergebnis jupyter zmq channel, wenn senden Sie es zu senden

In dem Quellcode jupyter, Verbindung zu ZMQ Kanal hergestellt wurde, als websocket

def open(self, kernel_id): 
    super(ZMQChannelsHandler, self).open() 
    try: 
     self.create_stream() 
    except web.HTTPError as e: 
     for channel, stream in self.channels.items(): 
      if not stream.closed(): 
       stream.close() 
     self.close() 
    else: 
     for channel, stream in self.channels.items(): 
      //this is callback function when receive message from zqm channel 
      stream.on_recv_stream(self._on_zmq_reply) 

während in der create_stream Funktion geöffnet wird, wurde der ZMQ Kanal eingerichtet.

def create_stream(self): 
    km = self.kernel_manager 
    identity = self.session.bsession 
    for channel in ('shell', 'iopub', 'stdin'): 
     meth = getattr(km, 'connect_' + channel) 
     self.channels[channel] = stream = meth(self.kernel_id, identity=identity) 
     stream.channel = channel 
     ... ignore no significance code 

, wenn der Server-Nachricht empfangen wurde ON_MESSAGE Zu diesem Zeitpunkt ZMQ Kanal empfangen Python-Code ausgeführt werden

def on_message(self, msg): 
    if not self.channels: 
     return 
    if isinstance(msg, bytes): 
     msg = deserialize_binary_message(msg) 
    else: 
     msg = json.loads(msg) 
    channel = msg.pop('channel', None) 
    if channel is None: 
     channel = 'shell' 
    if channel not in self.channels: 
     return 
    stream = self.channels[channel] 
    self.session.send(stream, msg) 

aufzurufen. Danach sollte das Ausführungsergebnis zurückkommen, daher sollte die obige Funktion on_recv_stream aufgerufen werden und wir haben das Ergebnis schließlich erhalten.

So schreibe ich das Python-Code-Snippet wie folgt aus:

from jupyter_client.multikernelmanager import MultiKernelManager 
from jupyter_client.session import Session 

from tornado import gen, web 
from tornado.concurrent import Future 
from tornado.ioloop import IOLoop 

km = MultiKernelManager() 

kernelid = km.start_kernel() 

kernel =km.get_kernel(kernelid) 

channel = km.connect_shell(kernelid) 

print 'channel', channel 


def on_reply(msg): 
    print 'we got return' 

def on_timeout(): 
    print("Timeout waiting for kernel_info_reply: %s", kernel_id) 

kernel.session.send(channel, 'kernel_info_request') 
channel.on_recv(on_reply) 

Eigentlich habe ich nicht die Rückmeldung bekommen haben, das heißt, die on_reply Funktion wurde nicht aufgerufen. Ich habe nicht das Problem, Kann mir niemand helfen?

+0

'connect_shell' gibt Ihnen eine ZMQ * Steckdose *, kein * Strom *, die Rückrufe haben würde. Um einen Stream zu erhalten, rufen Sie 'kernel.client()' auf, um ein KernelClient-Objekt zu erhalten, und 'kc.start_channels()', um seine Kanäle einzurichten. Um einen Stream zu verwenden, müssen Sie jedoch die Ereignisschleife von pyzmq ausführen. Hier sind die Dokumente dafür: http://pyzmq.readthedocs.io/en/latest/eventloop.html?highlight=on_recv –

Antwort

0

Ich löse das Problem wie folgt aus:

from jupyter_client.multikernelmanager import MultiKernelManager 


km = MultiKernelManager() 

kernelid = km.start_kernel('python2') 

kn =km.get_kernel(kernelid) 

kc = kn.client() 

kc.start_channels() 

msg_id = kc.execute('import math\nprint(math.sqrt(2))') 

while True: 
try: 
    msg = kc.get_iopub_msg() 
    print('\niopub msg is') 
    print(msg) 
except Excption,e: 
    print(e) 
    break 

if msg['parent_header'].get('msg_id') != msg_id: 
    continue 

msg_type = msg['msg_type'] 
content = msg['content'] 

print('content is :') 
print(content) 

if msg_type == 'status': 
    if content['execution_state'] == 'idle': 
     break 
    else: 
     continue 
Verwandte Themen