web-dev-qa-db-fra.com

Connexion à une instance IPython distante

Je souhaite exécuter une instance IPython sur une machine et y connecter (sur un réseau local) à partir d'un processus différent (pour exécuter des commandes python). Je comprends que cela soit possible avec zmq: http://ipython.org/ipython-doc/dev/development/ipythonzmq.html .

Cependant, je ne trouve pas de documentation sur la façon de le faire et même si cela est encore possible.

Toute aide serait appréciée!


MODIFIER

J'aimerais pouvoir me connecter à l'instance de noyau IPython et lui envoyer des commandes python. Cependant, cela ne devrait pas être fait via un outil graphique (qtconsole), mais je veux pouvoir me connecter à cette instance du noyau à partir d'un script python différent ...

par exemple.

external.py

somehow_connect_to_ipython_kernel_instance
instance.run_command("a=6")
24
Ohad

Si vous souhaitez exécuter du code dans un noyau à partir d'un autre programme Python, le moyen le plus simple consiste à connecter un BlockingKernelManager . Le meilleur exemple en ce moment est le vim-ipython client de Paul Ivanov, ou le client terminal client de IPython.

L'essentiel:

  • les noyaux ipython écrivent des fichiers de connexion JSON, au format IPYTHONDIR/profile_<name>/security/kernel-<id>.json, qui contiennent les informations nécessaires à la connexion et à l’exécution de code par divers clients.
  • KernelManagers sont les objets utilisés pour communiquer avec les noyaux (exécuter du code, recevoir des résultats, etc.). *

Un exemple de travail:

Dans un shell, faites ipython kernel (ou ipython qtconsole, si vous souhaitez partager un noyau avec une interface graphique déjà en cours d'exécution):

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

Ceci a écrit le fichier 'kernel-6759.json'

Ensuite, vous pouvez exécuter cet extrait de code Python pour connecter un KernelManager et exécuter du 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')

La sortie d'une course:

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

voir message spec pour plus d'informations sur l'interprétation de la réponse. Le cas échéant, les données stdout/err et display passeront par km.iopub_channel, et vous pouvez utiliser le msg_id renvoyé par Shell.execute() pour associer la sortie à une exécution donnée.

PS: Je m'excuse pour la qualité de la documentation de ces nouvelles fonctionnalités. Nous avons beaucoup d'écriture à faire.

26
minrk

Si vous souhaitez simplement vous connecter de manière interactive , vous pouvez utiliser le transfert SSH. Je n'ai trouvé cette documentation nulle part ailleurs sur Stack Overflow, et pourtant cette question est la plus proche. Cette réponse a été testée sur Ipython 0.13. J'ai eu l'information de cet article de blog .

  1. Exécutez ipython kernel sur la machine distante:

    user@remote:~$ ipython3 kernel
    [IPKernelApp] To connect another client to this kernel, use:
    [IPKernelApp] --existing kernel-25333.json
    
  2. Regardez le fichier 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. Configurez la redirection de port sur la machine locale: 

    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. Copiez le fichier kernel-25333.json sur la machine locale:

    user@local:~$ rsync -av user@remote:.ipython/profile_default/security/kernel-25333.json ~/.ipython/profile_default/security/kernel-25333.json
    
  5. Exécutez ipython sur la machine locale en utilisant le nouveau noyau:

    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
gerrit

Mise à jour de la réponse de minrk après la scission en jupyter. Avec Jupyter_client (4.1.1) , Le code le plus simple ressemble à quelque chose comme:

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

Notez que:

  • jupyter_client.BlockingKernelClient est également alias avec jupyter_client.client.BlockingKernelClient. 
  • le shell (km.Shell_channel) n'a plus la méthode execute () & get_msg ().

Actuellement, il est assez difficile de trouver une documentation mise à jour. rien encore sur http://jupyter-client.readthedocs.org/en/latest/ pour BlockingKernelClient. Certains codes dans https://github.com/jupyter/jupyter_kernel_test . Tout lien est le bienvenu.

13
S. Bougnoux

Les réponses ci-dessus sont un peu vieilles. La solution pour la dernière version de ipython est beaucoup plus simple mais n’est pas bien documentée à un endroit donné. J'ai donc pensé documenter cela ici. 

Solution pour se connecter depuis n'importe quel système d'exploitation à un noyau ipython s'exécutant sur Windows

Si le client ou le serveur est une linux ou un autre système d'exploitation, modifiez simplement l'emplacement de kernel-1234.json en fonction de Où kernel-1234.json se trouve-t-il dans Jupyter sous Windows?

  1. Au démarrage de votre noyau Windows, assurez-vous que ipykernel est installé à l'aide de pip install ipykernel
  2. Démarrer la ipykernel en utilisant ipython kernel -f kernel-1234.json
  3. Localisez le fichier kernel-1234.json sur votre machine Windows. Le fichier portera probablement un numéro différent, pas 1234, et sera très probablement situé dans 'C:\Utilisateurs\me\AppData\Roaming\jupyter\runtime\kernel-1234.json': https://stackoverflow.com/a/48332006/4752883
  4. Installez Jupyter Console (ou Jupyter Qtconsole/notebook) en utilisant pip install jupyter-console ou pip install qtconsolehttps://jupyter-console.readthedocs.io/en/latest/
  5. Si vous êtes sur Windows, faites une ipconfig pour connaître l'adresse IP de votre serveur Windows. (Sous Linux, faites une ifconfig à l'invite du shell). Dans le fichier kernel-1234.json, remplacez l'adresse IP par 127.0.0.1 par l'adresse ip de votre serveur. Si vous vous connectez depuis un autre serveur Windows, copiez le fichier kernel-1234.json sur votre ordinateur local et notez le chemin. 
  6. Naviguez jusqu'au dossier contenant le kernel-1234.json et démarrez Jupyter Console using jupyter console --existing kernel-1234.json
2
alpha_989

Si vous utilisez Anaconda, sous OS X, le fichier JSON est stocké sur 

/ Utilisateurs/[nom d'utilisateur]/Bibliothèque/Jupyter/runtime /

Sous Windows:

c:\Utilisateurs [nom d'utilisateur]\AppData\Roaming\jupyter\runtime \

1
32768