Подключение к удаленному экземпляру IPython
Я хотел бы запустить экземпляр IPython на одном компьютере и подключиться к нему (через локальную сеть) из другого процесса (для запуска некоторых команд python). Я понимаю, что это возможно с zmq: http://ipython.org/ipython-doc/dev/development/ipythonzmq.html.
Однако я не могу найти документацию о том, как это сделать и возможно ли это вообще пока.
Любая помощь будет оценена!
РЕДАКТИРОВАТЬ
Я хотел бы иметь возможность подключиться к экземпляру ядра IPython и отправить ему команды Python. Однако этого не следует делать с помощью графического инструмента (qtconsole), но я хочу иметь возможность подключиться к этому экземпляру ядра из другого скрипта Python...
например
external.py
somehow_connect_to_ipython_kernel_instance
instance.run_command("a=6")
5 ответов
Если вы хотите запустить код в ядре из другой программы Python, самый простой способ - подключить BlockingKernelManager. Лучшим примером этого сейчас является клиент vim-ipython Павла Иванова или собственный клиент терминала IPython.
Суть:
- Ядра ipython пишут файлы подключения JSON, в
IPYTHONDIR/profile_<name>/security/kernel-<id>.json
, которые содержат информацию, необходимую различным клиентам для подключения и выполнения кода. - KernelManager - это объекты, которые используются для связи с ядрами (выполнения кода, получения результатов и т. Д.). *
Рабочий пример:
В оболочке делай ipython kernel
(или же ipython qtconsole
, если вы хотите поделиться ядром с уже работающим графическим интерфейсом):
$> ipython kernel
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-6759.json
Это написал файл 'kernel-6759.json'
Затем вы можете запустить этот фрагмент Python для подключения KernelManager и запустить некоторый код:
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')
Результат прогона:
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
см. спецификацию сообщения для получения дополнительной информации о том, как интерпретировать ответ. Если это уместно, появится stdout/err и данные дисплея km.iopub_channel
и вы можете использовать msg_id, возвращаемый shell.execute()
связать вывод с данным исполнением.
PS: я прошу прощения за качество документации этих новых функций. У нас много работы.
Если вы просто хотите подключиться в интерактивном режиме, вы можете использовать пересылку SSH. Я еще не нашел этого документированного в Stack Overflow, но этот вопрос ближе всего. Этот ответ был протестирован на Ipython 0.13. Я получил информацию из этого поста в блоге.
Бежать
ipython kernel
на удаленной машине:user@remote:~$ ipython3 kernel [IPKernelApp] To connect another client to this kernel, use: [IPKernelApp] --existing kernel-25333.json
Посмотрите на
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 }
Настройте переадресацию портов на локальном компьютере:
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
Скопируйте
kernel-25333.json
файл на локальный компьютер:user@local:~$ rsync -av user@remote:.ipython/profile_default/security/kernel-25333.json ~/.ipython/profile_default/security/kernel-25333.json
Запустите ipython на локальной машине, используя новое ядро:
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
Обновление до ответа minrk после разделения на jupyter. С jupyter_client (4.1.1) самый простой код выглядит примерно так:
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')
Обратите внимание, что:
- jupyter_client.BlockingKernelClient также связывается с jupyter_client.client.BlockingKernelClient.
- оболочка (km.shell_channel) больше не имеет методов execute() и get_msg().
В настоящее время довольно сложно найти обновленную документацию; пока ничего нет на http://jupyter-client.readthedocs.org/en/latest/ для BlockingKernelClient. Некоторый код в https://github.com/jupyter/jupyter_kernel_test. Любая ссылка приветствуется.
Приведенные выше ответы немного устарели. Решение для последней версии ipython
намного проще, но не документировано хорошо в одном месте. Так что я решил документировать это здесь.
Решение для подключения из любой ОС к ядру ipython, работающему на Windows
Если клиент или сервер linux
или другой операционной системы, просто измените местоположение kernel-1234.json
соответственно основано на том, где kernel-1234.json находится в Jupyter под Windows?
- При запуске ядра на базе Windows убедитесь, что
ipykernel
устанавливается с помощьюpip install ipykernel
- Начать
ipykernel
с помощьюipython kernel -f kernel-1234.json
- Найдите
kernel-1234.json
файл на вашемWindows
машина. Файл, вероятно, будет иметь другой номер, не1234
и, скорее всего, будет находиться в C: \ Users \ me \ AppData \ Roaming \ jupyter \ runtime \ kernel-1234.json ': https://stackru.com/a/48332006/4752883 - Установите Jupyter Console (или Jupyter Qtconsole/notebook), используя
pip install jupyter-console
или жеpip install qtconsole
https://jupyter-console.readthedocs.io/en/latest/ - Если вы на Windows, сделайте
ipconfig
узнать IP-адрес вашего сервера Windows. (На Linux сделатьifconfig
в командной строке). вkernel-1234.json
файл изменить IP-адрес с127.0.0.1
на IP-адрес вашего сервера. Если вы подключаетесь с другогоWindows
сервер, затем скопируйтеkernel-1234.json
файл на локальный компьютер и запишите путь. - Перейдите в папку, содержащую
kernel-1234.json
и запустить консоль Jupyter с помощьюjupyter console --existing kernel-1234.json
Если вы используете Anaconda, в OS X файл JSON хранится в
/Users/[имя пользователя]/Library/Jupyter/ среда /
В Windows:
C:\Users[имя пользователя]\AppData\Roaming\jupyter\ выполнения \