Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@minrk
Created October 13, 2011 18:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save minrk/1285080 to your computer and use it in GitHub Desktop.
Save minrk/1285080 to your computer and use it in GitHub Desktop.
Watch IOPub traffic from IPython engines
import os
import sys
import json
import zmq
from IPython.zmq.session import Session
from IPython.parallel.util import disambiguate_url
from IPython.utils.path import get_ipython_dir
def main(connection_file):
"""watch iopub channel, and print messages"""
ctx = zmq.Context.instance()
with open(connection_file) as f:
cfg = json.loads(f.read())
location = cfg['location']
reg_url = cfg['url']
session = Session(key=cfg['exec_key'].encode('ascii'))
query = ctx.socket(zmq.XREQ)
query.connect(disambiguate_url(cfg['url'], location))
session.send(query, "connection_request")
idents,msg = session.recv(query, mode=0)
c = msg['content']
iopub_url = disambiguate_url(c['iopub'], location)
sub = ctx.socket(zmq.SUB)
# This will subscribe to all messages:
sub.setsockopt(zmq.SUBSCRIBE, b'')
# replace with b'' with b'engine.1.stdout' to subscribe only to engine 1's stdout
# 0MQ subscriptions are simple 'foo*' matches, so 'engine.1.' subscribes
# to everything from engine 1, but there is no way to subscribe to
# just stdout from everyone.
# multiple calls to subscribe will add subscriptions, e.g. to subscribe to
# engine 1's stderr and engine 2's stdout:
# sub.setsockopt(zmq.SUBSCRIBE, b'engine.1.stderr')
# sub.setsockopt(zmq.SUBSCRIBE, b'engine.2.stdout')
sub.connect(iopub_url)
while True:
idents,msg = session.recv(sub, mode=0)
# ident always length 1 here
topic = idents[0]
if msg['msg_type'] == 'stream':
# stdout/stderr
# stream names are in msg['content']['name'], if you want to handle
# them differently
print "%s: %s" % (topic, msg['content']['data'])
elif msg['msg_type'] == 'pyerr':
# Python traceback
c = msg['content']
print topic + ':'
for line in c['traceback']:
# indent lines
print ' ' + line
if __name__ == '__main__':
if len(sys.argv) > 1:
cf = sys.argv[1]
else:
# default path:
cf = os.path.join(get_ipython_dir(), 'profile_default', 'security', 'ipcontroller-client.json')
main(cf)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment