VSCode+Docker 构建 Python 开发环境

1 优缺点

1.1 优点

  • 写代码和调试更方便
  • 带语法提示且反应快
  • 支持直接在命令行敲命令运行
  • 一个工具同时开发调试 Python+JS+HTML....
  • 方便在各代码文件间跳转
  • 生态丰富
  • 查找替换方便:可以指定文本或文件夹
  • 可对比文件差异
  • ……

1.2 缺点

  • 配置有点麻烦
  • 需要一些学习成本

2 方法

2.1 前提

假设 vscode 已正常安装,并且已有支持 Python 的 docker 环境

2.2 在 Docker 内安装 ssh 服务

2.2.1 进入 docker

1
2
3
4
5
6
7
8
9
10
11
12
$ apt-get install openssh-server
$ passwd 输入密码,后面登录时输入
$ vim /etc/ssh/sshd_config

加入以下三行:
PubkeyAuthentication yes #启用公钥私钥配对认证方式
PermitRootLogin yes #允许root用户使用ssh登录
PasswordAuthentication yes

$ /etc/init.d/ssh restart
$ ssh root@localhost
# 此时从docker可正常连接ssh接口```

有时更新 remote ssh 或 vscode 最新版本能修好

2.2.2 退出 docker 后保存镜像

1
$ docker commit CONTAINER_ID IMAGE_ID:TAG

2.2.3 再次运行 docker 时映射端口

在 docker run 命令中加如下参数:

1
-p 8822:22 

2.2.4 在 docker 之外连接

1
$ ssh root@127.0.0.1 -p 8822

2.2.5 问题与解决

我遇到的问题是每次都要手动开一下

1
$ /etc/init.d/ssh restart

可将启动 ssh 加在/root/.bashrc 中,或者 build docker image 时加入启动脚本。

2.3 使用 VSCode 连接本地 container

调出扩展面板(Ctrl+Shift+X)

安装:Remote Development 插件

打开命令面板(Ctrl+Shift+P)

输入 remote-ssh,选择 open Configuration file,按提示输入主机地址,用户名,密码等信息(一个设置文件中允许同时添加多个连接)。

此时,左侧出现 " 远程资源管理器选项卡 ",点连接右侧的 attach remote container 可连接远程主机。

登录后看起来就像是打开了一个本地项目,选择文件夹作为工作目录。

同时打开多个项目时,右键点击 contrainer,选择 attach in new window。

2.4 连接远程主机上的 docker container

连接远程主机中的 docker,操作如下:

首先,远程主机端也需要启动 docker 并向外暴露端口如 8822。

在左侧打开远程资源管理器,在第二个选项卡选择 SSH Target。

打开命令面板(Ctrl+Shift+P),输入 remote-ssh,选择 open Configuration file,添加如下内容:

1
2
3
4
Host 192.168.1.201
HostName 192.168.1.201
Port 8822
User root

保存后,左侧远程资源管理器内容被刷新,然后点该项右侧的 Connect to Host...并按提示输入密码后,即可正常连接。

2.5 运行代码

写一个简单的 python 文件,如:

1
print("abcde")

然后点击左侧运行按钮,选择运行和调试,此时会提示安装 Python 扩展,我选择了第一个推荐 "Python"。

安装后再运行,选择 Python,提示设置 launch.json;在左侧面板选择创建 launch.json,然后选择 Python,保持默认选项即可。

此时,即可通过运行按钮(播放键)直接运行程序,运行结果在下方的终端面板中显示。

2.6 Jupyter Notebook

2.6.1 基本用法

目前 Jupyter 已合入 python 插件,安装之后即可使用,输代码后点左侧的小箭头运行即可。

这样在 vscode 中画图的问题也解决了。

Pasted image 20220113093302.png

(我之前的 docker 里安装过 jupyter,所以可能跳过了安装 jupyter 内核 ipykernel 的过程 pip3 install ipykernel)

2.6.2 使用小技巧

  • 单元格右上方的小菜单,可快速设置单元格类型。
  • 限制单元格输出行数:在搜索栏找 “output.textLineLimit”,设置行数
  • 自动显示 Cell 的执行时间
  • 点上面横版菜单中的 outline,在左下角出现 markdown 大纲视图
  • 仍可使用和 Jupyter 网页版一样的快捷键,几乎没有学习成本
    • Shift+ 回车执行
    • dd 删除单元
  • 打开文件时新建而不替换当前文件
    • 设置:workbench.editor.enablePreview": false

3 小技巧

3.1 推荐主题

浅色:Github Plus theme

3.2 快捷键

  • 调出终端面板:Ctrl+ 左上角的点
  • 调出设置:Ctrl+ 逗号
  • 展开单元格输出:Ctrl+K,T
  • 调出风格切换:Ctrl+T
  • 选择解释器:Ctrl+Shift+P(在多个 Python 版本间切换)
  • 批量注释/取消注释:ctrl+/

3.3 修改字体大小

3.3.1 右侧字体大小

Setting->设置 ->文件编辑器 ->字体 ->在 Setting.json 中编辑,将 "window.zoomLevel" 设为 1.25 或 1.5,则所有字体都会变大。

3.4 开启 Ctrl+ 滚轮缩放

设置 ->查找: Mouse->Editor Mouse Wheel Zoom->勾选

3.5 文件差异比较

右键选一个文件 ->选择进行比较

右键选另一个文件 ->与已选项目进行比较

3.6 发布博客

利用插件可在 cnblog 发布博客

4 问题与解决

4.1 问题一

  • 问题:ssh 在命令行可以正常连接,vscode 连接时报错:XHR failed
  • 原因:wget 下载 vscode-server 压缩包时出现 SSL 错误
  • 排查方法:XHR failed 可能不止这一种原因,先通过 Vscode->View->Output 看具体错误,我遇到的问题是 wget 报错
  • 解决方法:
1
2
3
4
5
6
7
8
# 查看 commit id
ls ~/.vscode-server/bin
# 手动下载
https://update.code.visualstudio.com/commit:xxx(commit id)/server-linux-x64/stable
# 解压
cd ~/.vscode-server/bin/$COMMIT_ID
tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1
# 如果还不行,就把 vscode-server-linux-x64.tar.gz 改名为 vscode-server-linux-x64.tar.gz 放入在该目录下,然后给 wget 改名,使其不能下载覆盖安装包

4.2 问题二

  • 问题:找不到已安装的 Python 库
  • 原因:这可能是由于 docker 中安装了多个版本 Python 环境
  • 解答:打开命令面板(Ctrl+Shift+P),Python 选择解析器,选择正确的版本即可

4.3 问题三

  • 问题:如何同时打开多个项目
  • 解答:每个窗口对应一个项目,打开多个窗口,即可打开多个项目

4.4 问题四

  • 问题:为什么我限制了 Notebook 输出行,但是不管用
  • 解答:如果有多个工作位置(比如有本地,有远程),需要分别设置

4.5 问题五

  • 问题:误删了 Jupyter 的 Cell 怎么办?
  • 解答:按 Esc 退出当前块的编辑状态,然后按 z 键

5 参考

Python基础——VScode + docker进行代码调试

20个好看的VSCode主题推荐

jupyter-notebooks官方教程