Spyder:如何在本地编辑python脚本并在远程内核上执行它?

时间:2014-11-02 12:36:33

标签: python ipython remote-debugging spyder

我在Windows 7下使用Spyder 2.3.1并在Rasperry Pi RASPBIAN Linux操作系统上运行了一个iPython 2.3内核。

我可以使用.json文件和本教程连接到外部内核: Remote ipython console

但现在呢?如果我"跑"一个脚本(F5),然后内核尝试执行脚本,如:

%run "C:\test.py"

错误:找不到档案u'C:\\test.py'

这会返回错误,ofc,因为脚本位于我的机器上c:而不是远程机器/ raspberry pi上。如何告诉Spyder以某种方式将脚本首先复制到远程计算机并在那里执行?

如果我检查"这是一个远程内核"复选框,我无法再连接到现有内核。那个盒子是什么意思?它会在执行之前通过SSH将脚本复制到远程机器吗? 如果我输入SSH登录信息,我会得到一个"看起来内核意外死亡"错误。

4 个答案:

答案 0 :(得分:3)

你提到的教程是我们的日期,因为Spyder现在能够连接到远程内核。 "这是一个远程内核"复选框,选中后,启用对话框中您可以输入ssh连接凭据的部分。 (除非您手动打开所需的ssh隧道以转发远程内核的进程端口,否则您应该需要这个...)

此外,ipython连接信息(json文件)必须对应于在raspberry pi上运行的远程内核。

最后,当你跑步时,目前没有办法复制当地电脑上的脚本。首选方法实际上是相反的:使用sshfs之类的工具安装raspberry pi的文件系统并在适当的位置编辑它们。计划是在Spyder中实现一个sftp客户端,这样就不需要它了,你将能够从Spyder的文件浏览器中探索远程文件系统。

总结:

1)假设您已登录Rasberry pi,请启动本地IPython内核     ipython内核。它应该为您提供要使用的json文件的名称,您应将其复制到本地PC。

2)在你本地电脑上的spyder中,使用该json文件和你的ssh凭证连接到远程内核

我知道这很麻烦,但这是第一步......

答案 1 :(得分:2)

site-packages\spyderlib目录中搜索关键字%run后,我找到构建site-packages\spyderlib\plugins\ipythonconsole.py命令的方法(在%run中):

    def run_script_in_current_client(self, filename, wdir, args, debug):
    """Run script in current client, if any"""
    norm = lambda text: remove_backslashes(to_text_string(text))
    client = self.get_current_client()
    if client is not None:
        # Internal kernels, use runfile
        if client.kernel_widget_id is not None:
            line = "%s('%s'" % ('debugfile' if debug else 'runfile',
                                norm(filename))
            if args:
                line += ", args='%s'" % norm(args)
            if wdir:
                line += ", wdir='%s'" % norm(wdir)
            line += ")"
        else: # External kernels, use %run
            line = "%run "
            if debug:
                line += "-d "
            line += "\"%s\"" % to_text_string(filename)
            if args:
                line += " %s" % norm(args)
        self.execute_python_code(line)
        self.visibility_changed(True)
        self.raise_()
    else:
        #XXX: not sure it can really happen
        QMessageBox.warning(self, _('Warning'),
            _("No IPython console is currently available to run <b>%s</b>."
              "<br><br>Please open a new one and try again."
              ) % osp.basename(filename), QMessageBox.Ok)

我在else: # External kernels, use %run

之后添加了以下代码来转换路径
            # ----added to remap local dir to remote dir-------
            localpath = "Z:\wk"
            remotepath = "/mnt/sdb1/wk"
            if localpath in filename:
                # convert path to linux path
                filename = filename.replace(localpath, remotepath)
                filename = filename.replace("\\", "/")
            # ----- END mod

现在它在我点击F5时在远程机器上运行文件。 我在Spyder 2.3.9上,samba共享映射到z:drive。

答案 2 :(得分:2)

以为我会在我的第一篇博文中更新Roy Cai对Spyder 4的回答,以防万一有人在寻找这个问题。罗伊的回答对我来说是完美的。 Spyder 4已将相关代码从他编写答案时的位置移动了。该方法现在位于\ Lib \ site-packages \ spyder \ plugins \ ipythonconsole中,并且python文件为plugin.py。

其他所有操作均与以前相同-插入修改后的代码的位置相同,并且通过相同的更新程序对其进行修复。

(顺便说一句-是的,它能够保存登录信息以便在Spyder 4中登录到远程内核!)

答案 3 :(得分:1)

另一个选择是使用Spyder单元格将文件的全部内容发送到IPython控制台。我认为这比使用Samba或sshfs安装远程文件系统更容易(如果不可能或难以做到的话)。

通过在文件中添加# %%形式的行来定义单元格。例如,假设您的文件是:

# -*- coding: utf-8 -*-

def f(x):
    print(x + x)

f(5)

然后你可以像这样在底部添加一个单元格

# -*- coding: utf-8 -*-

def f(x):
    print(x + x)

f(5)

# %%

并在单元格行上方按 Ctrl + Enter ,文件的全部内容将被发送到控制台并立即进行评估。