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")
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.
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.
-
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
-
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 }
-
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
-
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
-
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
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.
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 \
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?
- Al iniciar el kernel basado en Windows, asegúrese de que
ipykernel
esté instalado usandopip install ipykernel
- Comience el
ipykernel
usandoipython kernel -f kernel-1234.json
- Localice el archivo
kernel-1234.json
en su máquinaWindows
. El archivo probablemente tendrá un número diferente, no1234
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 - Instalar Jupyter Console (o Jupyter Qtconsole/notebook) usando
pip install jupyter-console
opip install qtconsole
https://jupyter-console.readthedocs.io/en/latest / - Si está en Windows, haga un
ipconfig
para averiguar la dirección ip de su servidor Windows. (En Linux haga unifconfig
en el símbolo del shell). En el archivokernel-1234.json
cambie la dirección ip de127.0.0.1
a la dirección ip de su servidor. Si se está conectando desde otro servidorWindows
, copie el archivokernel-1234.json
en su computadora local y anote la ruta. - Vaya a la carpeta que contiene el
kernel-1234.json
y iniciar Jupyter Console usandojupyter console --existing kernel-1234.json
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