起因:

最近在捣鼓一些挺有意思的东西,今天了解到Jupyter这个功能强大的交互式笔记本后觉得自己现在正需要这样一个东西,恰好博主的云服务器现在还有约一半的空闲性能,于是开始着手将其部署到自己的服务器上,这篇博客主要记录这个过程和其中踩过的坑,整理出来方便日后需要


版本选择:

Jupyter还有一个改进版:JupyterLab,博主选择了后者,原因嘛,第一眼看着高大上(笑)

1
2
3
4
5
6
7
8
#这段好处摘自知乎,虽然大部分目前和博主没什么关系(笑)
#1.交互模式:Python交互式模式可以直接输入代码,然后执行,并立刻得到结果,因此Python交互模式主要是为了调试Python代码用的
#2.内核支持的文档:使你可以在可以在Jupyter内核中运行的任何文本文件(Markdown,Python,R等)中启用代码
#3.模块化界面:可以在同一个窗口同时打开好几个notebook或文件(HTML, TXT, Markdown等等),都以标签的形式展示,更像是一个IDE
#4.镜像notebook输出:让你可以轻易地创建仪表板
#5.同一文档多视图:使你能够实时同步编辑文档并查看结果
#6.支持多种数据格式:你可以查看并处理多种数据格式,也能进行丰富的可视化输出或者Markdown形式输出
#7.云服务:使用Jupyter Lab连接Google Drive等服务,极大得提升生产力

除此之外最吸引博主的是其notebook的编辑和运行模式,比较适合捣鼓最近学习的东西,不过这东西本质上是个Web应用,不像普通软件那样可以一键安装

服务器环境:Ubuntu20.04,Python 3.8.10,Node.js 16.14.2 (JupyterLab需要更新到12以上)


安装过程:

首先用root账户pip安装jupyterlab,随后生成配置文件

1
2
3
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple#下载慢就改镜像源(root用户)
pip install jupyterlab #root用户下
jupyter lab --generate-config #普通用户下

生成想要设定的密码对应的密文

1
2
3
from notebook.auth import passwd
passwd()
'xxxxx'

用vim打开刚才的配置文件(./jupyter目录下),添加

1
2
3
4
5
6
c.ServerApp.ip = '*'	#允许所有ip访问
c.ServerApp.port = xxxx #开放端口号,只要不冲突就行
c.ServerApp.open_browser = False #启动时不打开浏览器
c.ServerApp.root_dir = '/xxxx/xxxx/xxx' #使用编辑器时默认工作目录
c.ServerApp.password_required = True #登陆时需要密码
c.ServerApp.password = 'xxxxxxx' #密码对应的密文

开放服务器防火墙对应的端口,接着可以启动了,在本地浏览器访问服务器公网ip:xxxx即可

1
jupyter lab -p xxxx --no-browser	#xxxx是端口号

输入密码进入,好了,满眼的英文,看不懂几个,装中文包重启jupyterlab

1
pip install jupyterlab-language-pack-zh-CN

踩坑:

上网找了些插件推荐:jupyterlab_go_to_definition (跳转到定义),jupyterlab_lsp (代码跳转+补全),latex (数学公式语言),matplotlib (数据图形化),theme-darcula(界面主题),github,drawio(绘图),variableinspector(变量追踪),全装上了。提示需要重新编译整个jupyterlab来应用修改,这和vscode不同(装完顶多重新加载一遍),编译了一会,编译失败

听说有的源码编译容易出问题,清空再来几遍,还是失败,后来查到是有的插件不兼容新版本,没办法,枚举排除,好在插件不多,最终锁定variableinspector,同时了解到这个插件的功能已经整合到新版jupyterlab里了,卸载重新编译,成功

体验了一会,这玩意是为python量身打造的,操作起来特别舒服,也很快发现了问题:matplotlib的弹窗只是一张图片,压根没法交互,没办法继续搜索:得装一个叫ipympl的matplotlib专为Jupyter开发的交互式后端,然后又要重启jupyterlab

1
pip install ipympl	#root用户下

使用matplotlib前需要运行一句”%matplotlib widget”表示将其后端切换为”Matplotlib Jupyter Widget Backend”,交互就正常了。


后台运行:

为了让服务器断开ssh连接后保持运行,博主这里选择了screen工具,用到的命令有:

1
2
3
4
5
6
screen -S xx	#新建一个名为xx的窗口
screen -r xx #恢复xx窗口会话
screen -D -r xx #意外与xx窗口断开连接后显示状态为Attached,踢掉上一个会话,重新连接
screen -ls #列出当前活动的窗口
#脱离窗口快捷键:Ctrl + A 松开后按D (Detach分离)
#脱离当前窗口后再断开ssh,窗口里的进程不会停止

之后就能随时随地在浏览器正常使用了,JupyterLab用起来确实方便