web-dev-qa-db-de.com

Verbindung zu einer Remote-IPython-Instanz herstellen

Ich möchte eine IPython-Instanz auf einem Computer ausführen und von einem anderen Prozess aus (über LAN) eine Verbindung herstellen (um einige Python-Befehle auszuführen). Ich verstehe, dass es mit zmq möglich ist: http://ipython.org/ipython-doc/dev/development/ipythonzmq.html .

Ich kann jedoch keine Dokumentation finden, wie es geht und ob es überhaupt noch möglich ist.

Jede Hilfe wäre dankbar!


BEARBEITEN

Ich möchte in der Lage sein, eine Verbindung zur IPython-Kernel-Instanz herzustellen und ihr Python-Befehle zu senden. Dies sollte jedoch nicht über ein Grafiktool (qtconsole) erfolgen, aber ich möchte in der Lage sein, eine Verbindung zu dieser Kernel-Instanz aus einem anderen Python-Skript heraus herzustellen.

z.B.

extern.py

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

Wenn Sie Code aus einem anderen Python-Programm in einem Kernel ausführen möchten, können Sie am einfachsten einen BlockingKernelManager anschließen. Das beste Beispiel hierfür ist Paul Ivanovs vim-ipython client oder der eigene terminal-Client von IPython .

Der Gist:

  • ipython-Kernel schreiben JSON-Verbindungsdateien in IPYTHONDIR/profile_<name>/security/kernel-<id>.json, die Informationen enthalten, die für verschiedene Clients erforderlich sind, um eine Verbindung herzustellen und Code auszuführen.
  • KernelManager sind die Objekte, die zur Kommunikation mit den Kerneln verwendet werden (Code ausführen, Ergebnisse empfangen usw.). *

Ein Arbeitsbeispiel:

Führen Sie in einer Shell ipython kernel aus (oder ipython qtconsole, wenn Sie einen Kernel mit einer bereits laufenden GUI teilen möchten):

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

Dies schrieb die Datei 'kernel-6759.json'

Dann können Sie dieses Python-Snippet ausführen, um einen KernelManager zu verbinden, und Code ausführen:

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

Die Ausgabe eines Laufs:

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

weitere Informationen zur Interpretation der Antwort finden Sie in der message spec . Falls relevant, werden stdout/err und Anzeigedaten über km.iopub_channel übergeben, und Sie können die von Shell.execute() zurückgegebene msg_id verwenden, um die Ausgabe einer bestimmten Ausführung zuzuordnen.

PS: Ich entschuldige mich für die Qualität der Dokumentation dieser neuen Funktionen. Wir haben viel zu schreiben.

26
minrk

Wenn Sie nur interaktiv verbinden möchten, können Sie die SSH-Weiterleitung verwenden. Auf Stack Overflow habe ich das noch nicht dokumentiert, aber diese Frage kommt am nächsten. Diese Antwort wurde mit Ipython 0.13 getestet. Ich habe die Informationen aus diesem Blogbeitrag .

  1. Führen Sie ipython kernel auf dem Remote-Computer aus:

    [email protected]:~$ ipython3 kernel
    [IPKernelApp] To connect another client to this kernel, use:
    [IPKernelApp] --existing kernel-25333.json
    
  2. Schauen Sie sich die kernel-25333.json-Datei an:

    [email protected]:~$ 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. Richten Sie die Portweiterleitung auf dem lokalen Computer ein: 

    [email protected]:~$ ssh [email protected] -f -N -L 54985:127.0.0.1:54985
    [email protected]:~$ ssh [email protected] -f -N -L 50266:127.0.0.1:50266
    [email protected]:~$ ssh [email protected] -f -N -L 50378:127.0.0.1:50378
    [email protected]:~$ ssh [email protected] -f -N -L 49981:127.0.0.1:49981
    
  4. Kopieren Sie die kernel-25333.json-Datei auf den lokalen Computer:

    [email protected]:~$ rsync -av [email protected]:.ipython/profile_default/security/kernel-25333.json ~/.ipython/profile_default/security/kernel-25333.json
    
  5. Führen Sie ipython auf dem lokalen Computer mit dem neuen Kernel aus:

    [email protected]:~$ 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

Aktualisieren Sie die Antwort von minrk nach der Aufteilung in jupyter. Mit Jupyter_client (4.1.1) Lautet der einfachste Code so etwas wie:

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

Beachten Sie, dass:

  • jupyter_client.BlockingKernelClient ist auch mit jupyter_client.client.BlockingKernelClient ein Alias. 
  • die Shell (km.Shell_channel) hat die Methode execute () & get_msg () nicht mehr.

Derzeit ist es schwierig, eine aktualisierte Dokumentation zu finden. noch nichts auf http://jupyter-client.readthedocs.org/de/latest/ für BlockingKernelClient. Einige Codes in https://github.com/jupyter/jupyter_kernel_test . Jeder Link ist willkommen.

13
S. Bougnoux

Die obigen Antworten sind ein bisschen alt. Die Lösung für die neueste Version von ipython ist viel einfacher, aber an einer Stelle nicht gut dokumentiert. Also dachte ich, ich würde es hier dokumentieren. 

Lösung für die Verbindung von einem beliebigen Betriebssystem zu einem ipython-Kernel, der unter Windows ausgeführt wird

Wenn es sich bei dem Client oder Server um ein linux oder ein anderes Betriebssystem handelt, ändern Sie einfach den Ort von kernel-1234.json entsprechend basierend auf Wo befindet sich Kernel-1234.json in Jupyter unter Windows?

  1. Vergewissern Sie sich beim Start Ihres Windows-basierten Kernels, dass ipykernel mit pip install ipykernel installiert ist.
  2. Starten Sie die ipykernel mit ipython kernel -f kernel-1234.json
  3. Suchen Sie die kernel-1234.json-Datei auf Ihrem Windows-Rechner. Die Datei hat wahrscheinlich eine andere Nummer als 1234 und befindet sich höchstwahrscheinlich unter 'C:\Users\me\AppData\Roaming\jupyter\runtime\kernel-1234.json': https: // stackoverflow. com/a/48332006/4752883
  4. Installieren Sie die Jupyter Console (oder das Jupyter Qtconsole/notebook) mit pip install jupyter-console oder pip install qtconsolehttps://jupyter-console.readthedocs.io/de/latest/
  5. Wenn Sie mit Windows arbeiten, ermitteln Sie die IP-Adresse Ihres Windows-Servers anhand einer ipconfig. (Unter Linux führen Sie am Shell Prompt eine ifconfig durch). Ändern Sie in der Datei kernel-1234.json die IP-Adresse von 127.0.0.1 in die IP-Adresse Ihres Servers. Wenn Sie von einem anderen Windows-Server aus eine Verbindung herstellen, kopieren Sie die kernel-1234.json-Datei auf Ihren lokalen Computer und notieren Sie sich den Pfad. 
  6. Navigieren Sie zu dem Ordner, der den kernel-1234.json enthält, und starten Sie Jupyter Console mit jupyter console --existing kernel-1234.json.
2
alpha_989

Wenn Sie Anaconda verwenden, wird die JSON-Datei unter OS X unter gespeichert 

/ Benutzer/[Benutzername]/Bibliothek/Jupyter/Laufzeit /

Unter Windows:

c:\Benutzer [Benutzername]\AppData\Roaming\jupyter\runtime \

1
32768