diff --git a/IPython/parallel/__init__.py b/IPython/parallel/__init__.py index d265596..22d3b69 100644 --- a/IPython/parallel/__init__.py +++ b/IPython/parallel/__init__.py @@ -20,6 +20,7 @@ import warnings import zmq +from IPython.config.configurable import MultipleInstanceError from IPython.zmq import check_for_zmq if os.name == 'nt': @@ -51,12 +52,23 @@ def bind_kernel(**kwargs): This function returns immediately. """ + from IPython.zmq.ipkernel import IPKernelApp from IPython.parallel.apps.ipengineapp import IPEngineApp + + # first check for IPKernelApp, in which case this should be a no-op + # because there is already a bound kernel + if IPKernelApp.initialized() and isinstance(IPKernelApp._instance, IPKernelApp): + return + if IPEngineApp.initialized(): - app = IPEngineApp.instance() - else: - raise RuntimeError("Must be called from an IPEngineApp instance") + try: + app = IPEngineApp.instance() + except MultipleInstanceError: + pass + else: + return app.bind_kernel(**kwargs) + + raise RuntimeError("bind_kernel be called from an IPEngineApp instance") - return app.bind_kernel(**kwargs)