使用本地qtconsole连接到AWS上的远程内核?

时间:2015-08-28 20:33:32

标签: ipython ipython-notebook

按照此处列出的说明进行操作:

运行笔记本服务器 - IPython 1.2.1:下午的Hack文档 - https://ipython.org/ipython-doc/rel-1.1.0/interactive/public_server.html

我已经能够通过浏览器连接到Amazon AWS上的远程笔记本服务器。我可以使用本地qtconsole访问此内核吗?换句话说,我可以在本地客户端上执行类似的操作:

%ipython qtconsole --kernel

我担心的是上面列出的说明是指浏览器连接到远程服务器所需的密码和证书。如何使用所需的qtconsole?可能需要某种隧道才能处理这种情况?

提前致谢。

1 个答案:

答案 0 :(得分:3)

我花了一段时间才弄清楚所以我以为我会把别人的麻烦拯救出来。链接

http://jupyter.org/qtconsole/stable/#ssh-tunnels

提供了一些线索,但不完整。请注意,我有兴趣将本地ipython qtconsole连接到远程内核。首先是开始 通过

操作远程计算机上的控制台
% ipython console

这会启动亚马逊实例上的ipython控制台。接下来,我手动 将kernel-*.json文件传输到本地计算机。此文件自动在远程实例的.ipython/profile_default/security目录中创建。请注意,kernel-*.json表示运行ipython console时自动创建的内核文件。通常,这看起来像kernel-21311.json。可以使用.ipython配置文件对其进行配置,但这是另一个故事。

# filename: console_tunnels.py
import json
import argparse
from sshtunnel import SSHTunnelForwarder
from time import sleep

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('ipython_json',
                        type=str,
                        help='ipython kernel json file')
    parser.add_argument('--host',
                        type=str,
                        help='hostname',
                        default='awsinstance')
    parser.add_argument('-k',
                        '--private_key',
                        type=str,
                        help='private_key',
                        default='/home/reckoner/.ssh/id_rsa')
    parser.add_argument('-u',
                        '--username',
                        type=str,
                        help='username',
                        default='reckoner')
    args = parser.parse_args()
    ports_keys = ['stdin_port', 'control_port', 'hb_port', 'shell_port',
                  'iopub_port']
    d = json.load(open(args.ipython_json))
    addresses = [('127.0.0.1', d[i]) for i in ports_keys]

    with SSHTunnelForwarder(
        ssh_username=args.username,
        local_bind_addresses=addresses,
        remote_bind_addresses=addresses,
        ssh_private_key=args.private_key,
        ssh_address=args.host, ):
        while True:
            # press Ctrl-C for stopping
            sleep(0.5)

接下来,我在客户端计算机上运行上面列出的脚本

% python console_tunnels.py kernel-*.json

然后所有正确的端口都转发!

下一步是通过将本地qtconsole指向它来启动本地qtconsole kernel - * .json文件我之前下载过。

% ipython qtconsole --existing kernel-*.json

那就是它!你现在可以在qtconsole中工作,但所有的计算 发生在远程实例上。最重要的是,qtconsole中打开图形窗口会在客户端上打开它们,而数据和计算驻留在远程实例上!

享受!