I would like to run an IPython instance on one machine and connect to it (over LAN) from a different process (to run some python commands). I understand that it is possible with zmq : http://ipython.org/ipython-doc/dev/development/ipythonzmq.html .
However, I can not find documentation on how to do it and whether it is even possible yet.
Any help would be appreciated!
EDIT
I would like to be able to connect to IPython kernel instance and send it python commands. However, this should not be done via a graphic tool (qtconsole) , but I want to be able to connect to that kernel instance from within a different python script...
e.g.
somehow_connect_to_ipython_kernel_instance instance.run_command("a=6")
Go to Preferences -> IPython console -> Startup and select the tickbox next to Open an IPython console at startup. Then click the OK button. The next time Spyder starts, it will show the IPython console automatically.
Click Connect to an existing kernel from the Console menu or the IPython Console pane's “Gear” menu. Browse for or enter the path to the connection file from the previous step. If you're connecting to a local kernel, click Ok and Spyder should connect to the kernel; if a remote kernel, proceed to the final step.
If you want to run code in a kernel from another Python program, the easiest way is to connect a BlockingKernelManager. The best example of this right now is Paul Ivanov's vim-ipython client, or IPython's own terminal client.
The gist:
IPYTHONDIR/profile_<name>/security/kernel-<id>.json
, which contain information necessary for various clients to connect and execute code.A working example:
In a shell, do ipython kernel
(or ipython qtconsole
, if you want to share a kernel with an already running GUI):
$> ipython kernel [IPKernelApp] To connect another client to this kernel, use: [IPKernelApp] --existing kernel-6759.json
This wrote the 'kernel-6759.json' file
Then you can run this Python snippet to connect a KernelManager, and run some code:
from IPython.lib.kernel import find_connection_file from IPython.zmq.blockingkernelmanager import BlockingKernelManager # this is a helper method for turning a fraction of a connection-file name # into a full path. If you already know the full path, you can just use that cf = find_connection_file('6759') km = BlockingKernelManager(connection_file=cf) # load connection info and init communication km.load_connection_file() km.start_channels() def run_cell(km, code): # now we can run code. This is done on the shell channel shell = km.shell_channel print print "running:" print code # execution is immediate and async, returning a UUID msg_id = shell.execute(code) # get_msg can block for a reply reply = shell.get_msg() status = reply['content']['status'] if status == 'ok': print 'succeeded!' elif status == 'error': print 'failed!' for line in reply['content']['traceback']: print line run_cell(km, 'a=5') run_cell(km, 'b=0') run_cell(km, 'c=a/b')
The output of a run:
running: a=5 succeeded! running: b=0 succeeded! running: c=a/b failed! --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) /Users/minrk/<ipython-input-11-fb3f79bd285b> in <module>() ----> 1 c=a/b ZeroDivisionError: integer division or modulo by zero
see the message spec for more information on how to interpret the reply. If relevant, stdout/err and display data will come over km.iopub_channel
, and you can use the msg_id returned by shell.execute()
to associate output with a given execution.
PS: I apologize for the quality of the documentation of these new features. We have a lot of writing to do.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With