Conexión a una instancia IPython remota


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 al núcleo IPython instance and send it python commands. 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 python diferente...

Por ejemplo

External.py

somehow_connect_to_ipython_kernel_instance
instance.run_command("a=6")
Author: denfromufa, 2012-04-02

5 answers

Si desea ejecutar código en un núcleo desde otro programa Python, la forma más fácil es conectar un BlockingKernelManager. El mejor ejemplo de esto en este momento es el cliente vim-ipython de Paul Ivanov, o el propio cliente terminal de IPython.

Lo esencial:

  • los núcleos 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 código.
  • Los KernelManagers son los objetos que se utilizan para comunicarse con núcleos (ejecutar código, recibir resultados, etc.).). *

Un ejemplo de trabajo:

En un shell, haga ipython kernel (o ipython qtconsole, si desea compartir un núcleo con una interfaz gráfica de usuario ya en ejecución):

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

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

Entonces puede ejecutar este fragmento 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 ejecución:

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 interpreta la respuesta. Si es relevante, los datos stdout / err y display vendrán km.iopub_channel, y puede usar el msg_id devuelto por shell.execute() para asociar la salida con una ejecución dada.

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

 25
Author: minrk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-02 15:51:48

Si solo desea conectar interactivamente, puede usar el reenvío SSH. No encontré esto documentado en ningún lugar en Stack Overflow todavía, sin embargo, esta pregunta se acerca más. Esta respuesta ha sido probada en Ipython 0.13. Tengo la información de esta entrada del blog.

  1. Ejecute ipython kernel en el equipo remoto:

    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. Configurar 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 a 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 utilizando el nuevo núcleo:

    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
    
 21
Author: gerrit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-24 17:34:37

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.cliente.Bloqueando el cliente del servicio.
  • la cáscara (km.shell_channel) ya no tiene el método execute () & get_msg ().

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

 12
Author: S. Bougnoux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-04 09:55:25

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

/Users / [username] / Library / Jupyter/runtime /

En Windows:

C:\Users [nombre de usuario] \ AppData \ Roaming \ jupyter \ runtime \

 1
Author: 32768,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-11 15:58:43

Las respuestas anteriores son un poco antiguas. La solución para la última versión de ipython es mucho más simple, 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 núcleo ipython que se ejecuta en Windows

Si el cliente o el servidor es un linux u otro sistema operativo, simplemente cambie la ubicación de kernel-1234.json apropiadamente basado en Donde está kernel-1234.json ubicado en Jupyter bajo Windows?

  1. Al iniciar el kernel basado en Windows, asegúrese de que ipykernel esté instalado usando pip install ipykernel
  2. Comience el ipykernel usando 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://stackoverflow.com/a/48332006/4752883
  4. Instalar Jupyter Console (o Jupyter Qtconsole/notebook) usando 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 símbolo 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 Windows, copie el archivo kernel-1234.json en su computadora local y anote la ruta.
  6. Vaya a la carpeta que contiene el kernel-1234.json y iniciar Jupyter Console usando jupyter console --existing kernel-1234.json
 1
Author: alpha_989,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-01 03:47:24