Подключение к удаленному экземпляру IPython - PullRequest
27 голосов
/ 02 апреля 2012

Я хотел бы запустить экземпляр IPython на одном компьютере и подключиться к нему (через локальную сеть) из другого процесса (для запуска некоторых команд python). Я понимаю, что это возможно с zmq: http://ipython.org/ipython-doc/dev/development/ipythonzmq.html.

Однако я не могу найти документацию о том, как это сделать и возможно ли это еще.

Любая помощь будет оценена!


EDIT

Я бы хотел иметь возможность подключиться к экземпляру ядра IPython и отправить ему команды python. Однако этого не следует делать с помощью графического инструмента (qtconsole), но я хочу иметь возможность подключаться к этому экземпляру ядра из другого скрипта Python ...

, например

external.py

somehow_connect_to_ipython_kernel_instance
instance.run_command("a=6")

Ответы [ 5 ]

29 голосов
/ 02 апреля 2012

Если вы хотите запустить код в ядре из другой программы 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: Я прошу прощения за качество документации этих новых функций. У нас много работы.

22 голосов
/ 07 марта 2013

Если вы просто хотите подключиться в интерактивном режиме , вы можете использовать пересылку SSH. Я еще не нашел этого документированного в Stack Overflow, но этот вопрос ближе всего подходит. Этот ответ был протестирован на Ipython 0.13. Я получил информацию от этого блога .

  1. Выполнить ipython kernel на удаленном компьютере:

    user@remote:~$ ipython3 kernel
    [IPKernelApp] To connect another client to this kernel, use:
    [IPKernelApp] --existing kernel-25333.json
    
  2. Посмотрите на файл 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. Настройка переадресации портов на локальном компьютере:

    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. Скопируйте файл kernel-25333.json на локальный компьютер:

    user@local:~$ rsync -av user@remote:.ipython/profile_default/security/kernel-25333.json ~/.ipython/profile_default/security/kernel-25333.json
    
  5. Запустите 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
    
13 голосов
/ 04 марта 2016

Обновление до ответа 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. Любая ссылка приветствуется.

3 голосов
/ 19 января 2018

Приведенные выше ответы немного устарели.Решение для последней версии ipython намного проще, но не документировано в одном месте.Так что я решил документировать это здесь.

Решение для подключения из любой ОС к ядру ipython, работающему на Windows

Если клиент или сервер является linux или другой операционной системой, просто измените расположение kernel-1234.json соответственно основано на Где kernel-1234.json находится в Jupyter под Windows?

  1. При запуске ядра на основе Windows убедитесь, что ipykernel установлен с помощью pip install ipykernel
  2. Запустите ipykernel, используя ipython kernel -f kernel-1234.json
  3. Найдите файл kernel-1234.json на вашем компьютере Windows.Файл, вероятно, будет иметь другое число, отличное от 1234, и, скорее всего, он будет находиться в папке «C: \ Users \ me \ AppData \ Roaming \ jupyter \ runtime \ kernel-1234.json»: https://stackoverflow.com/a/48332006/4752883
  4. Установите Jupyter Console (или Jupyter Qtconsole / notebook), используя pip install jupyter-console или pip install qtconsole https://jupyter -console.readthedocs.io / en / latest /
  5. Если вы находитесь наWindows делает ipconfig, чтобы узнать IP-адрес вашего сервера Windows.(В Linux введите ifconfig в командной строке).В файле kernel-1234.json измените IP-адрес с 127.0.0.1 на IP-адрес вашего сервера.Если вы подключаетесь с другого сервера Windows, скопируйте файл kernel-1234.json на локальный компьютер и запишите путь.
  6. Перейдите в папку, содержащую kernel-1234.json и запустите Консоль Jupyter , используя jupyter console --existing kernel-1234.json
1 голос
/ 11 января 2016

Если вы используете Anaconda, в OS X файл JSON хранится в

/ Users / [имя пользователя] / Library / Jupyter / runtime /

В Windows:

c: \ Users [имя пользователя] \ AppData \ Roaming \ jupyter \ runtime \

...