Łą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")
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.
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 .
-
Uruchom
ipython kernel
na zdalnej maszynie:user@remote:~$ ipython3 kernel [IPKernelApp] To connect another client to this kernel, use: [IPKernelApp] --existing kernel-25333.json
-
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 }
-
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
-
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
-
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
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.
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\
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.json
odpowiednio na gdzie jest jądro-1234.json znajduje się w Jupyter pod Okna?
- podczas uruchamiania jądra systemu windows upewnij się, że
ipykernel
jest zainstalowany przy użyciupip install ipykernel
- Uruchom
ipykernel
używającipython kernel -f kernel-1234.json
- zlokalizuj plik {[3] } na swojej maszynie
Windows
. Plik prawdopodobnie będzie miał inny numer, nie1234
i najprawdopodobniej będzie znajdował się w 'C:\Users\me\AppData\Roaming\jupyter\runtime\kernel-1234.json": {https://stackoverflow.com/a/48332006/4752883 - zainstaluj konsolę Jupyter (lub Jupyter Qtconsole/notebook) za pomocą
pip install jupyter-console
lubpip install qtconsole
https://jupyter-console.readthedocs.io/en/latest / - Jeśli korzystasz z systemu Windows, wykonaj
ipconfig
, aby dowiedzieć się o adresie ip swojego serwera Windows. (W Linuksie wykonajifconfig
w wierszu polecenia powłoki). W plikukernel-1234.json
Zmień adres ip z127.0.0.1
na adres IP Twojego serwera. Jeśli łączysz się z innego serweraWindows
, skopiuj plikkernel-1234.json
na komputer lokalny i zanotuj ścieżkę. - przejdź do folderu zawierającego
kernel-1234.json
i Uruchom konsolę Jupyter używającjupyter 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 03:47:24