什么是Spyder
Spyder是一个强大的Python IDE,为科学家、工程师和数据分析师设计。 
Spyder编写代码后运行,可以实时查看与修改变量,也可在Python交互终端实时执行代码。

调试模式下调试代码也比较方便。

Spyder也支持Cell语法,可以分块运行代码。和Matlab、Jupyter中的Cell功能类似的,只不过Spyder中的Cell是通过# %%注释来实现的,通过Cell我们就可以单独运行和调试代码片段了。

Sypder的安装
- Spyder可以通过安装包或者Conda来安装,Windows和Mac用户可以使用安装包来安装,Linux用户建议使用Conda安装,下面是使用Conda安装的步骤。
# 创建环境
conda create -n spyder -y
# 激活环境
conda activate spyder
# 安装Spyder
conda install spyder
# 运行Spyder
spyder
- 如果是带有原生桌面的Linux系统,输入spyder命令后,Spyder窗口直接就出来了。

无GUI界面的Ubuntu如何使用Spyder
Spyder不像Browser/Server架构的Rstudio Server、Jupyter一样可以基于浏览器访问,Spyder是一个桌面端应用。如果在没有GUI界面的Linux服务器运行Spyder,会直接报错。

Spyder Online
如果不想安装Spyder,只是想尝试一下,可以用Spyder Binder在线使用Spyder。

- 点击进去会发现Spyder Binder提供的是一个图形化的Linux系统,其预装了Spyder,打开就能使用了。不过使用起来可能比较鸡肋,因为这个Linux系统无法和电脑上的粘贴板互通,也就是不能相互复制粘贴。


X11转发
Linux本身是没有图形化界面的,其后续使用的图形化界面,底层均基于X协议,X11指的是X协议的第十一个版本。X协议分为Server端和Client端:
- X Client就是具体的应用程序,如Firefox、Spyder等,其向X Server发送在某处绘制某些图形的请求,并接收X Server的事件输入。
- X Server负责接受图形的绘制,其接收X Client的图形绘制请求进行绘图,并将用户的交互操作事件发送给X Client。
原生桌面系统中X Server端和X Client端都在同一个电脑上面,对于普通用户而言,X协议的存在感比较低。但由于X协议客户端与服务端分离的设计,使得X Server和X Client可以不在同一个电脑之上,二者可以通过网络进行数据交换!基于以上协议,我们可以通过SSH的X11转发,让没有图形化界面的Linux系统运行图形化软件,通过使用本地电脑的图形化界面进行交互。
服务器开启X11转发
# 编辑SSH配置文件
sudo vim /etc/ssh/sshd_config
# 确保X11Forwarding是开启的
X11Forwarding yes
# 重启SSH服务使得配置生效
sudo systemctl restart ssh

本地电脑使用支持X协议的软件连接服务器
使用支持X协议的软件SSH连接到服务器,这里推荐使用MobaXterm,其支持X协议。这里比较绕的一点是,我们是在SSH客户端运行了X服务端,实际上可以简单理解为X协议中谁负责画图谁就是服务端。
如果上一步正确开启了X11Forwarding,那么在MobaXterm连接上去的时候,其会提示remote display is forwarded through SSH。

使用MobaXterm连接上服务器后,Linux命令行运行spyder命令,本地电脑就会弹出Spyder窗口,在这个窗口编辑的文件,环境均是服务器上的。

运行spyder命令后,Linux终端会阻塞等待直到中断命令或者关闭Spyder窗口,如果还要执行Linux命令,需要新开一个会话来执行Linux命令。

综合体验下来X11转发的方式使用Spyder还算可以,不过比较依赖网络,建议内网使用。如果是走互联网公网访问,有可能出现卡顿等情况影响操作。
本地Spyder连接远程内核
使用安装包的方式安装Spyder比较简单,都是默认选项一直安装就行。

安装好后打开使用,和上述Spyder Online和X11转发方式使用上没有差异。

本地的Spyder可以连接远程的内核,在服务器Linux客户端执行下面命令启动一个内核进程。
# 进入Spyder环境
conda activate spyder
# 启动spyder内核,如果没安装,则这样安装 pip install spyder-kernels
python -m spyder_kernels.console

/home/用户名/.local/share/jupyter/runtime目录下把kernel-xxx.json文件下载到本地,然后本地的Spyder点击Connect to an existing kernel,连接到远程的内核。

Connection file选择上一步下载下来的文件,按连接SSH的方式填充remote kernel的信息。

连上后就能使用服务器上的环境执行本地电脑上的代码了,这种方式是最节约网络带宽的,使用起来不会有卡顿的感觉,缺点就是代码文件和执行环境分开了,不过搭配Git使用,代码同步都是小问题(使用Git保存代码)。

画图功能也是正常的,切换到Plots这个窗口就能看到。

常见问题
X11转发中断了如何处理?
如果在X11转发运行Spyder的过程中,SSH连接断开了,再次启动会提示Spyder is already running. If you want to open a new instance, please use the –new-instance option。如果我们一直使用–new-instance参数,会导致启动多个Spyder进程,所以最好不要这样做。

可以kill掉旧的Spyder,再启动即可。
# 通过监听端口找到Spyder的进程号
ss -tnlp
# 杀死Spyder进程
kill -9 Spyder的进程号
# 启动Spyder
spyder

本地Spyder是否可以连接以前的内核?
- 如果执行python -m spyder_kernels.console命令过程中,SSH连接断开了,这个内核就关闭了。后续再次执行python -m spyder_kernels.console,会生成一个新的文件,需要下载新的kernel-xxx.json文件来连接,否则会报错An error occurred while starting the kernel。


- 运行python -m spyder_kernels.console命令的时候是无法复用以前的kernel-xxx.json文件的,这个文件只是记录了本次内核运行时的本地端口等状态信息,内核关闭了就是关闭了,无法再复原。如果怕SSH连接断开导致内核中断,可以搭配screen命令使用。(screen命令用法)





