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 脚本并在远程内核上执行?的主要内容,如果未能解决你的问题,请参考以下文章