一、目的
本文的主要解决的问题:手上有性能较差的轻便办公本和云服务器。怎么用VS Code 让两者产生关系,并经过一系列的操作使得我们能够在轻便地用办公本(such as MBP)调用服务器强劲的计算性能。
除了C++,其他东西我现在全用vscode来写了,爽的一笔,毫无竞争对手。——某知友
VS Code 自出生以来就能看出其强大,同宇宙第一大IDE( Visual Studio ) 一以贯之的的设计风格,但又和VS 存在本质的区别——轻便的编辑器和无限可能的后端。
VS Code是一个平台,提供了Debug API,Source Control API,Language Extension,允许整个生态基于这些 API开发Extension。
二、方法
VS Code 涵盖各种插件,本文通过各种插件实现用服务器运行本地代码、同步本地和服务器代码、本地调试服务器代码。
2.1 jupyter 大法好
jupyter 提供了一套完整了remote 的服务器方案。jupyter 有千千万万的优点,但是就不是IDE,为什么不把 Jupyter 的remote 解决方案移植到VS Code 中来,既有了jupyter 各种花里胡哨的表现能力又有了了IDE该有的代码编辑能力,顺带还通过Jupyter完成了本地代码编写+远程服务器计算的方案。真是两全其美。
既然要在Jupyter上做文章,第一步就是在服务器上安装jupyter 相信这一步大家都很熟悉了,不熟悉的话,我这里随便推个知友的连接 豆豆:Jupyter Notebook介绍、安装及使用教程。其中比较重点的就是在服务器端需要设置让jupyter监听所有IP。那怎么设置呢?
就是打开jupyter_notebook_config.py
vim .jupyter/jupyter_notebook_config.py
加入如下代码
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.allow_remote_access = True
其中 ip = “*” 指的是监听所有ip 发过来的请求 ,其他几项字面意思。
设置好之后直接在明两行输入jupyter notebook,就出现了这段冗长的东西,我们等下要用到的就是URLs: 这段东西。
图1. 截图 From ubuntu
OK, 设置清楚了服务器端的东西,现在,把目光转移到我们的本地主机上。既然有了URLs, 我们的思路通过VS Code 直接连接到这个服务器的这个窗口(图一所示,端口号8888)。好了现在就需要VS Code 的插件登场了。安装插件jupyter
图2. 搜索插件jupyter直接安装
安装好之后,直接按快捷键 command+shift+p , 调出Python: Specify Jupyter server URI。 选择type in the URI for Jupyter server。
图3. 调出 URI 输入
然后输入 jupyter的URI:服务器的地址加端口(such as https://127.0.0.1:8888) + "/?token=blabla#$%%&^&*^%%$" 。 完成以上简单步骤,开袋即食。如下看看效果。
图4. jupyter 在vs code 中的使用
TIPs:如果在URI中直接用服务器的地址,有可能会出现服务器未响应的可能(我就经历了,我也不懂为什么,有懂的小伙伴赶紧告诉我,很急)。 我的解决方案是用ssh 映射服务器端口到本地端口,在终端输入下面代码:
ssh ubuntu@remote_address -L 127.0.0.1:8888:127.0.0.1:8888
OK ,简而言之,就是把远程的8888端口映射到本地的8888端口。然后我们在输入URI的时候,URI 的输入地址就是本地地址(127.0.0.1:8888)。
2.2 好用的ptvsd
这个python包的出现完全是针对vscode远程调试所开发,它的基本原理就是:预设本地和服务器存在相同的代码文件(在要调试的文件开头需要有专门的识别代码,后文会提到),首先服务器端运行代码,程序运行到这段识别代码后,就会暂停,等待本地IDE的调试指令,当本地调试指令开始,两边就确立了同步关系,在这个时候本地就能接收远程返回的调试参数。从而达到目的。
其实也非常简单,步骤分为三步:
第一步:准备代码,在代码开头植入以下代码:
import ptvsd
ptvsd.enable_attach(address = ('127.0.0.1', 8848))
ptvsd.wait_for_attach()
这几段代码只在远程服务器起作用。它的意思呢,就是远程服务器监听 127.0.0.1:8848 的消息,等待和本地IDE的py交易。
当然这份代码如前面所说,需要拷贝两份分别在本地和服务器。通常我们的方法是通过ssh 把文件传到服务器上去。代码如下:
scp demo.py ubuntu@remote_address:/path
OK 远程端口已经准备好了,之后就是设置VS code 的参数访问远程服务器的8848端口。
第二步:准备本地VScode的启动参数。所有的一切都可以在Vscode 的 lunch,json 里设置,
{
"name": "Remote",
"type": "python",
"request": "attach", //这个必须attach
"host": "remote_address", //云服务器地址
"port": 8848, //刚才在代码里设置的端口
"pathMappings": [
{
"localRoot": "${workspaceRoot}",
"remoteRoot": "/home/vito/Mac" //云服务器文件的跟目录
}
],
},
设置调试的方式为“Remote”.
第三步: 调试,确保两边的代码完全相同,然后在远程段启动代码。
图5. 远程程序进入等待本地调试的响应
图6. 本地和远程两端同步运行代码
当然可能也会存在2.1提到的,无法直接连接到远程服务器。so 可以接着沿用上面的小tips.