我在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登录信息,我会得到一个"看起来内核意外死亡"错误。
答案 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 ,文件的全部内容将被发送到控制台并立即进行评估。