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

Posted

技术标签:

【中文标题】Spyder:如何在本地编辑 python 脚本并在远程内核上执行?【英文标题】:Spyder: How to edit a python script locally and execute it on a remote kernel? 【发布时间】:2014-12-29 05:32:03 【问题描述】:

我在 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: 下,而不是远程机器/树莓派上。如何告诉 Spyder 以某种方式首先将脚本复制到远程机器并在那里执行?

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

【问题讨论】:

【参考方案1】:

你提到的教程有点过时了,因为 Spyder 现在能够连接到远程内核。 选中时,“这是远程内核”复选框,可以在其中输入SSH连接凭据的对话框中的部分。 (除非您手动打开所需的 ssh 隧道来转发远程内核的进程端口,否则您应该需要它...)

此外,ipython 连接信息(json 文件)必须与远程内核相对应,在您的树莓派上运行。

最后,当您点击运行时,目前无法复制位于本地 PC 上的脚本。首选的方法实际上是相反的:使用 sshfs 之类的工具安装树莓派的文件系统并就地编辑它们。计划是在 Spyder 中实现一个 sftp 客户端,这样就不需要它,您将能够从 Spyder 的文件资源管理器中探索远程文件系统。

总结一下:

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

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

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

【讨论】:

所以,假设我通过一个已经存在的 json 文件连接到远程机器上的 iPython 内核。如果没有“这是一个远程内核”复选框,这已经可以工作了。 为什么我需要输入任何 SSH 凭据?然后 Spider 会登录到我的树莓派并在那里启动 ipython 内核并为我获取 json 文件吗? 我使用 samba 能够从树莓派的主目录加载脚本。然后连接到内核。所以我可以在本地编辑文件,然后进入 ipython 控制台并手动“运行 xyz.py”(没有 F5)。那么这应该工作。谢谢! 如果您使用的是无密码 ssh 连接,则无需选中 这是一个远程内核 框。我想这是你的设置,否则我不明白你是如何连接到你的树莓派的。无论如何,该功能可以帮助用户打开 ssh 隧道,以便他们可以自动连接到其他机器中的内核。但如果你不需要它,那么你就不必担心它。【参考方案2】:

另一种选择是使用 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,文件的全部内容将被发送到控制台并立即进行评估。

【讨论】:

酷!,不知道。我工作。不幸的是我遇到了,你不能使用 STRG+C 远程内核。在我的应用程序中,我无限期地在一些外部 LED 条上运行动画。如果你按 STRG+C spyder 会告诉你“--------------- IPython ------------ --------------- 内核进程要么是远程的,要么是未指定的。不能中断 ------------- -- OK ---------------------------- " 所以我会在用树莓的 PWM GPIO 写一些循环后将程序更改为结束循环销。 是的,目前无法中断外部内核。有关它的一些讨论,请参阅此IPython issue。【参考方案3】:

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

    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: 驱动器。

【讨论】:

你能提供更多细节吗?当您按下 F5 时,您的 Windows Spyder 似乎会尝试从远程计算机复制代码并在 Windows 上执行它?您不需要打开 SSH 连接来实际将执行命令发送到远程主机吗? 我设置spyder使用op提到的json文件连接到远程ipython内核,当f5被击中时,spyder将%run filepath发送到ipython内核,op出现错误是因为不,远程机器上不存在文件路径,我将 samba 文件共享映射到 z: 驱动器,以便远程具有 第二部分(对不起,我不小心点击了提交)远程机器具有相同的文件(在发送命令之前,spyder也保存文件),我的答案中的代码将本地文件路径转换为远程文件路径。至于第二个问题,我认为 ssh 不是必需的,但是我确实在 spyder 中使用了 ssh 选项,但我认为它只进行端口转发(因为我在远程机器上有防火墙)。 我明白了,谢谢!我在远程 Ubuntu 服务器上启动了内核,并将相应的 json 文件复制到我的 Windows 机器上。然后我在“连接到现有内核”对话框中输入了信息,但是当我单击连接时,它显示“无法打开 SSH 隧道,Paramiko 不可用”。对下一步做什么有什么想法吗? 只需在本地计算机上执行pip install Paramiko,具体取决于您的 python 站点包位置,您可能需要以管理员身份运行 cmd 才能安装。【参考方案4】:

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

除此之外的一切都和以前一样 - 插入修改代码的位置相同,并且相同的更新修复了它。

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

【讨论】:

以上是关于Spyder:如何在本地编辑 python 脚本并在远程内核上执行?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spyder 调试远程 python 文件

Python spyder代码编辑区怎么打开

如何在 python 的 spyder IDE 中添加模块

如何使用spyder

哪个python IDE在运行后提供python控制台(如Spyder)?

如何将ipython添加入spyder的python console中