python ipython zeromq jupyter pyzmq

Conectando a una instancia remota de IPython



zeromq jupyter (5)

Actualizar a la respuesta de minrk después de la división a jupyter. Con jupyter_client (4.1.1) el código más simple es algo así como:

import jupyter_client cf=jupyter_client.find_connection_file(''6759'') km=jupyter_client.BlockingKernelClient(connection_file=cf) km.load_connection_file() km.execute(''a=5'')

Tenga en cuenta que:

  • jupyter_client.BlockingKernelClient también tiene un alias con jupyter_client.client.BlockingKernelClient.
  • el shell (km.shell_channel) ya no tiene el método execute () & get_msg ().

Actualmente es bastante difícil encontrar una documentación actualizada; nada aún en http://jupyter-client.readthedocs.org/en/latest/ para BlockingKernelClient. Algún código en https://github.com/jupyter/jupyter_kernel_test . Cualquier enlace de bienvenida.

Me gustaría ejecutar una instancia de IPython en una máquina y conectarme a ella (a través de LAN) desde un proceso diferente (para ejecutar algunos comandos de Python). Entiendo que es posible con zmq: http://ipython.org/ipython-doc/dev/development/ipythonzmq.html .

Sin embargo, no puedo encontrar documentación sobre cómo hacerlo y si aún es posible.

¡Cualquier ayuda sería apreciada!

EDITAR

Me gustaría poder conectarme a la instancia del kernel de IPython y enviar comandos de python. Sin embargo, esto no debe hacerse a través de una herramienta gráfica (qtconsole), pero quiero poder conectarme a esa instancia del kernel desde un script de Python diferente ...

p.ej

external.py

somehow_connect_to_ipython_kernel_instance instance.run_command("a=6")


Las respuestas anteriores son un poco viejas. La solución para la última versión de ipython es mucho más sencilla pero no está bien documentada en un solo lugar. Así que pensé en documentarlo aquí.

Solución para conectarse desde cualquier sistema operativo a un kernel ipython que se ejecuta en Windows

Si el cliente o el servidor es un sistema operativo linux u otro, solo cambie la ubicación del kernel-1234.json apropiada según la ubicación del kernel-1234.json en Jupyter bajo Windows?

  1. En el inicio del kernel basado en Windows, asegúrese de que ipykernel esté instalado usando pip install ipykernel
  2. Inicie el ipykernel usando el ipython kernel -f kernel-1234.json
  3. Localice el archivo kernel-1234.json en su máquina Windows . El archivo probablemente tendrá un número diferente, no 1234 y lo más probable es que se encuentre en ''C: / Users / me / AppData / Roaming / jupyter / runtime / kernel-1234.json'': https://.com/a/48332006/4752883
  4. Instale la consola Jupyter (o Jupyter Qtconsole / notebook) utilizando pip install jupyter-console o pip install qtconsole https://jupyter-console.readthedocs.io/en/latest/
  5. Si está en Windows, haga un ipconfig para averiguar la dirección IP de su servidor Windows. (En Linux, haga un ifconfig en el indicador de comandos del shell). En el archivo kernel-1234.json , cambie la dirección IP de 127.0.0.1 a la dirección IP de su servidor. Si se está conectando desde otro servidor de Windows , copie el archivo kernel-1234.json en su computadora local y anote la ruta.
  6. Navegue a la carpeta que contiene el kernel-1234.json e inicie la Consola Jupyter usando la jupyter console --existing kernel-1234.json

Si desea ejecutar código en un kernel desde otro programa de Python, la forma más sencilla es conectar un BlockingKernelManager . El mejor ejemplo de esto ahora mismo es el cliente vim-ipython Paul Ivanov, o el propio cliente terminal de IPython.

La esencia:

  • Los kernels de ipython escriben archivos de conexión JSON, en IPYTHONDIR/profile_<name>/security/kernel-<id>.json , que contienen la información necesaria para que varios clientes se conecten y ejecuten el código.
  • KernelManagers son los objetos que se utilizan para comunicarse con los kernels (ejecutar código, recibir resultados, etc.). *

Un ejemplo de trabajo:

En una shell, haga ipython kernel (o ipython qtconsole , si desea compartir un kernel con una GUI ya en ejecución):

$> ipython kernel [IPKernelApp] To connect another client to this kernel, use: [IPKernelApp] --existing kernel-6759.json

Esto escribió el archivo ''kernel-6759.json''

Luego, puede ejecutar este fragmento de código de Python para conectar un KernelManager y ejecutar algún código:

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'')

La salida de una carrera:

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

consulte la especificación del mensaje para obtener más información sobre cómo interpretar la respuesta. Si es relevante, los datos de stdout / err y display aparecerán en km.iopub_channel , y puede usar el msg_id devuelto por shell.execute() para asociar la salida con una ejecución determinada.

PD: Me disculpo por la calidad de la documentación de estas nuevas características. Tenemos mucho que escribir.


Si está utilizando Anaconda, en OS X el archivo JSON se almacena en

/ Usuarios / [nombre de usuario] / Library / Jupyter / runtime /

En Windows:

c: / Users [nombre de usuario] / AppData / Roaming / jupyter / runtime /


Si solo desea conectarse de forma interactiva , puede usar el reenvío SSH. No encontré esto documentado en ningún lugar en todavía, pero esta pregunta es la más cercana. Esta respuesta se ha probado en Ipython 0.13. Obtuve la información de este blog .

  1. Ejecute el ipython kernel en la máquina remota:

    user@remote:~$ ipython3 kernel [IPKernelApp] To connect another client to this kernel, use: [IPKernelApp] --existing kernel-25333.json

  2. Mira el archivo kernel-25333.json :

    user@remote:~$ cat ~/.ipython/profile_default/security/kernel-25333.json { "stdin_port": 54985, "ip": "127.0.0.1", "hb_port": 50266, "key": "da9c7ae2-02aa-47d4-8e67-e6153eb15366", "shell_port": 50378, "iopub_port": 49981 }

  3. Configure el reenvío de puertos en la máquina local:

    user@local:~$ ssh user@remote -f -N -L 54985:127.0.0.1:54985 user@local:~$ ssh user@remote -f -N -L 50266:127.0.0.1:50266 user@local:~$ ssh user@remote -f -N -L 50378:127.0.0.1:50378 user@local:~$ ssh user@remote -f -N -L 49981:127.0.0.1:49981

  4. Copie el archivo kernel-25333.json en la máquina local:

    user@local:~$ rsync -av user@remote:.ipython/profile_default/security/kernel-25333.json ~/.ipython/profile_default/security/kernel-25333.json

  5. Ejecute ipython en la máquina local usando el nuevo kernel:

    user@local:~$ ipython3 console --existing kernel-25333.json Python 3.2.3 (default, Oct 19 2012, 19:53:16) Type "copyright", "credits" or "license" for more information. IPython 0.13.1.rc2 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython''s features. %quickref -> Quick reference. help -> Python''s own help system. object? -> Details about ''object'', use ''object??'' for extra details. In [1]: import socket; print(socket.gethostname()) remote