34

我想在一台机器上运行一个 IPython 实例并从不同的进程(通过 LAN)连接到它(运行一些 python 命令)。我知道 zmq 是可能的:http: //ipython.org/ipython-doc/dev/development/ipythonzmq.html

但是,我找不到有关如何执行此操作以及是否可行的文档。

任何帮助,将不胜感激!


编辑

我希望能够连接到 IPython 内核实例并向其发送 python 命令。但是,这不应该通过图形工具 (qtconsole) 来完成,但我希望能够从不同的 python 脚本中连接到该内核实例......

例如

外部.py

somehow_connect_to_ipython_kernel_instance
instance.run_command("a=6")
4

5 回答 5

31

如果你想在另一个 Python 程序的内核中运行代码,最简单的方法是连接一个BlockingKernelManager。现在最好的例子是 Paul Ivanov 的vim-ipython客户端,或者 IPython 自己的终端客户端

要点:

  • ipython 内核编写 JSON 连接文件,IPYTHONDIR/profile_<name>/security/kernel-<id>.json其中包含各种客户端连接和执行代码所需的信息。
  • KernelManager 是用于与内核通信(执行代码、接收结果等)的对象。*

一个工作示例:

在 shell 中,执行ipython kernel(或者ipython qtconsole,如果您想与已运行的 GUI 共享内核):

$> 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:对于这些新功能的文档质量,我深表歉意。我们有很多写作要做。

于 2012-04-02T15:51:48.307 回答
28

如果你只是想交互连接,你可以使用 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
    
于 2013-03-07T10:39:13.593 回答
21

拆分到 jupyter 后更新到 minrk 的答案。使用 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。
  • shell (km.shell_channel) 不再有方法 execute() & get_msg()。

目前很难找到更新的文档;BlockingKernelClient的http://jupyter-client.readthedocs.org/en/latest/上还没有任何内容。https://github.com/jupyter/jupyter_kernel_test中的一些代码。欢迎任何链接。

于 2016-03-04T09:55:25.100 回答
5

上面的答案有点老了。最新版本的解决方案ipython要简单得多,但在一个地方没有很好地记录。所以我想我会在这里记录下来。

从任何操作系统连接到运行的 ipython 内核的解决方案Windows

如果客户端或服务器是linux操作系统或其他操作系统,只需根据 Windows 下 Jupyter 中的 kernel-1234.json 位于何处kernel-1234.json

  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. pip install jupyter-console使用或https://jupyter-console.readthedocs.io/en/latest/安装 Jupyter 控制台(或 Jupyter Qtconsole/notebook)pip install qtconsole
  5. 如果您在 Windows 上,请ipconfig找出您的 Windows 服务器的 IP 地址。(在 Linuxifconfig上,在 shell 提示符下执行)。在kernel-1234.json文件中将 IP 地址从更改127.0.0.1为您的服务器的 IP 地址。如果您从另一台Windows服务器连接,则将kernel-1234.json文件复制到本地计算机并记下路径。
  6. 导航到包含并使用kernel-1234.json启动Jupyter 控制台的文件夹jupyter console --existing kernel-1234.json
于 2018-01-18T23:55:48.023 回答
1

如果您使用 Anaconda,在 OS X 中 JSON 文件存储在

/Users/[用户名]/Library/Jupyter/runtime/

在 Windows 中:

c:\Users[用户名]\AppData\Roaming\jupyter\runtime\

于 2016-01-11T15:30:38.060 回答