【问题标题】:Spyder: How to edit a python script locally and execute it on a remote kernel?Spyder:如何在本地编辑 python 脚本并在远程内核上执行?
【发布时间】: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 登录信息,我会收到“似乎内核意外死亡”错误。

【问题讨论】:

    标签: python ipython remote-debugging spyder


    【解决方案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 中保存登录信息以登录远程内核的能力!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      相关资源
      最近更新 更多