Łączenie się ze zdalną instancją IPython

Chciałbym uruchomić instancję IPython na jednej maszynie i połączyć się z nią (przez LAN) z innego procesu (aby uruchomić niektóre polecenia Pythona). Rozumiem, że z zmq jest to możliwe : http://ipython.org/ipython-doc/dev/development/ipythonzmq.html .

Nie mogę jednak znaleźć dokumentacji, jak to zrobić i czy jest to jeszcze możliwe.

Każda pomoc będzie mile widziana!

EDIT

Chciałbym móc połączyć się z jądrem IPython instancja i wyślij mu polecenia Pythona. Nie powinno się tego jednak robić za pomocą narzędzia graficznego (qtconsole), ale chcę móc połączyć się z tą instancją jądra z poziomu innego skryptu Pythona...

Np.

External.py

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

5 answers

Jeśli chcesz uruchomić kod w jądrze z innego programu Pythona, najprostszym sposobem jest podłączenie BlockingKernelManager . Najlepszym tego przykładem jest Vim-ipython Client Paula Ivanova, lub własny terminal client.

Gist:

  • jądra ipython zapisują pliki połączeń JSON w IPYTHONDIR/profile_<name>/security/kernel-<id>.json, które zawierają informacje niezbędne dla różnych klientów do połączenia i wykonania kodu.
  • Kernelmanagery są obiektami, które sÄ ... uĺźywane do komunikacji z kernelami (wykonuj kod, odbieraj wyniki, itp.). *

Przykład roboczy:

W powłoce wykonaj ipython kernel (lub ipython qtconsole, jeśli chcesz udostępnić jądro z już działającym GUI):

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

Napisał " jądro-6759.plik json

Następnie możesz uruchomić ten fragment Pythona, aby podłączyć KernelManager i uruchomić kod:

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

Wyjście biegu:

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

Zobacz spec wiadomości aby uzyskać więcej informacji na temat interpretacja odpowiedzi. Jeśli jest to istotne, dane stdout / err i display zostaną wyświetlone km.iopub_channel i możesz użyć msg_id zwracanego przez shell.execute(), aby powiązać wyjście z danym wykonaniem.

PS: przepraszam za jakość dokumentacji tych nowych funkcji. Mamy dużo do napisania.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 15:51:48

Jeśli chcesz po prostu połączyć się interaktywnie , możesz użyć przekierowania SSH. Nie znalazłem tego nigdzie udokumentowane na Stack Overflow jeszcze, ale to pytanie jest najbliżej. Ta odpowiedź została przetestowana na IPython 0.13. Mam informacje z tego posta na blogu .

  1. Uruchom ipython kernel na zdalnej maszynie:

    user@remote:~$ ipython3 kernel
    [IPKernelApp] To connect another client to this kernel, use:
    [IPKernelApp] --existing kernel-25333.json
    
  2. Spójrz na plik 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. Ustawianie przekierowania portów na lokalnej maszynie:

    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. Skopiuj plik kernel-25333.json do lokalnego komputera:

    user@local:~$ rsync -av user@remote:.ipython/profile_default/security/kernel-25333.json ~/.ipython/profile_default/security/kernel-25333.json
    
  5. Uruchom ipython na lokalnej maszynie używając nowego jądra:

    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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 17:34:37

Aktualizacja do odpowiedzi minrka po podziale na jupyter. Z jupyter_client (4.1.1) najprostszy kod to raczej coś w stylu:

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

Zauważ, że:

  • jupyter_client.BlockingKernelClient jest również aliasowany za pomocą jupyter_client.klient.BlockingKernelClient.
  • the shell (km.shell_channel) nie posiada już metody execute () & get_msg ().

Obecnie dość trudno jest znaleźć zaktualizowaną dokumentację; jeszcze nic na http://jupyter-client.readthedocs.org/en/latest / dla BlockingKernelClient. Jakiś kod w https://github.com/jupyter/jupyter_kernel_test . każdy link mile widziany.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-04 09:55:25

Jeśli używasz Anacondy, w OS X plik JSON jest przechowywany w

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

W Windows:

C:\Users[username]\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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-11 15:58:43

Powyższe odpowiedzi są trochę stare. Rozwiązanie dla najnowszej wersji ipython jest znacznie prostsze, ale nie jest dobrze udokumentowane w jednym miejscu. Więc pomyślałem, że udokumentuję to tutaj.

Rozwiązanie do podłączenia z dowolnego systemu operacyjnego do jądra ipython działającego na Windows

Jeśli klient lub serwer jest linux lub innym systemem operacyjnym, po prostu zmień lokalizację kernel-1234.jsonodpowiednio na gdzie jest jądro-1234.json znajduje się w Jupyter pod Okna?

  1. podczas uruchamiania jądra systemu windows upewnij się, że ipykernel jest zainstalowany przy użyciu pip install ipykernel
  2. Uruchom ipykernel używając ipython kernel -f kernel-1234.json
  3. zlokalizuj plik {[3] } na swojej maszynie Windows. Plik prawdopodobnie będzie miał inny numer, nie 1234 i najprawdopodobniej będzie znajdował się w 'C:\Users\me\AppData\Roaming\jupyter\runtime\kernel-1234.json": {https://stackoverflow.com/a/48332006/4752883
  4. zainstaluj konsolę Jupyter (lub Jupyter Qtconsole/notebook) za pomocą pip install jupyter-console lub pip install qtconsole https://jupyter-console.readthedocs.io/en/latest /
  5. Jeśli korzystasz z systemu Windows, wykonaj ipconfig, aby dowiedzieć się o adresie ip swojego serwera Windows. (W Linuksie wykonaj ifconfig w wierszu polecenia powłoki). W pliku kernel-1234.json Zmień adres ip z 127.0.0.1 na adres IP Twojego serwera. Jeśli łączysz się z innego serwera Windows, skopiuj plik kernel-1234.json na komputer lokalny i zanotuj ścieżkę.
  6. przejdź do folderu zawierającego kernel-1234.json i Uruchom konsolę Jupyter używając 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 03:47:24