245 lines
13 KiB
Markdown
245 lines
13 KiB
Markdown
---
|
||
layout : post
|
||
title : "Jupyter——Code, note and data presentation platform"
|
||
subtitle : "代码,笔记以及数据展示平台"
|
||
date : 2022-09-09 08:48:32
|
||
author : "Manford Fan"
|
||
catalog : false
|
||
header-img : "img/post-bg-universe.jpg"
|
||
tags :
|
||
- Python
|
||
- Jupyter
|
||
- Ipython
|
||
---
|
||
|
||
距离上次记录已经有两个月的时间了,这是艰难的两个月,中间发生了很多很多事情,搞得整个人身心俱疲。好在时间是最好的医生,可以抚平所有的不快乐,也能让人看清楚现实,拍拍屁股,继续向前走。很早之前就听说过Jupyter,之前LY上课的时候说老师推荐他们用这个,前段时间支援ECX的时候,LYB也在自己的黑群晖上建了一个给我用,当时我还是用不习惯,说还是PyCharm好用,直到现在也觉得PyCharm好用,只不过在不同应用场景下,Jupyter优势还是很明显的。
|
||
|
||
## 一、Jupyter Notebook/Lab 简介
|
||
|
||
Jupyter Notebook: 经典的笔记交互界面。Jupyter Notebook是最原始的网页应用,它被用来创建和分享计算标注文档,并提供简洁,易于理解的以为当为中心的代码体验。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。
|
||
|
||
Jupyter Lab: 下一代的笔记交互界面。Jupyter Lab是最新的基于网页的用于交互计算的应用程序,它可以是笔记,代码和数据融合的交互式开发环境。这种灵活的交互界面允许用户按照自己的习惯来进行大数据分析,科学计算,机器学习的流程按安排和配置。符合潮流的模块化设计,使得Jupyter Lab具有丰富的功能和高度的可扩展性。
|
||
|
||
由此可见,Jupiter Lab是Jupiter Notebook的升级版,前者是后者的超集,而且官方也明确说后续会使用前者替代后者,所以一步到位,这次我们使用Jupyter Lab作为工作环境。
|
||
|
||
## 二、安装在线服务
|
||
|
||
安装Jupyter Lab在线服务分为环境准备,服务安装以及多用户配置是三个部分,其中服务安装配置完成之后,可以直接使用IP:Port的形式直接访问,也可以使用Nginx做一个反向代理,让该服务以域名的形式出现,显得更加简洁。
|
||
|
||
#### 1. 环境准备
|
||
|
||
这里主要准备了Python3的运行环境,升级更新了*pip*和*setuptools*这两个系统工具(不更新有可能会报错);另外安装过程中可能会提示如下不建议使用root账号来使用*pip*的建议,这里也选择了忽略,个人环境无所谓,企业环境中还是最好使用非root账号;在一个就是需要安装*ipython*,因为无论是notebook还是lab环境用的都是*ipython*。
|
||
|
||
> WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to usea virtual environment instead: https://pip.pypa.io/warnings/venv
|
||
|
||
```bash
|
||
apt install python3-pip python3-dev
|
||
pip3 install --upgrade setuptools
|
||
pip3 install --upgrade pip
|
||
pip3 install ipython
|
||
```
|
||
|
||
#### 2. 服务安装与配置
|
||
|
||
以*jupyterlab*为例,安装的过程是很简单的,但是可能会需要点时间,安装完成之后需要设定密码,生成配置文件,然后将默认的配置文件根据下面的提示修改一下,就可以直接运行了。
|
||
|
||
```bash
|
||
pip3 install jupyterlab
|
||
jupyter lab password
|
||
jupyter lab --generate-config
|
||
|
||
# c.ServerApp.ip = '0.0.0.0'
|
||
# c.ServerApp.port = 8000
|
||
# c.ServerApp.open_browser = False
|
||
# c.ServerApp.root_dir = '/xxxx/xxxx/xxx'
|
||
# c.ServerApp.password_required = True
|
||
# c.ServerApp.password = 'xxxxxxx'
|
||
```
|
||
|
||
如果想要了解更多的用法,可以在命令行运行`jupyter lab --help`命令,在安装配置的过程中,需要注意如下几点:
|
||
|
||
1. 如果以root用户运行的话,需要加上 `--allow-root`选项
|
||
2. 如果是多用户使用的话,需要使用`--config + 配置文件`选项指定配置文件路径
|
||
3. 有些系统Python3的模块管理工具是`pip`,有些是`pip3`,以实际为准
|
||
4. 如果需要其他模块,可以在服务端直接用`pip`安装,然后在Jupiter Lab中就可以直接使用了
|
||
5. 配置Nginx反向代理的话需要区分不同路径,比如*terminal/api*,具体可参考如下
|
||
|
||
```nginx
|
||
server {
|
||
server_name jupyter.rustle.cc;
|
||
listen [::]:443 ssl http2;
|
||
listen 443 ssl http2;
|
||
listen [::]:80;
|
||
listen 80;
|
||
charset utf-8;
|
||
access_log logs/jupyter.access.log main;
|
||
|
||
location / {
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header Host $http_host;
|
||
proxy_redirect off;
|
||
proxy_set_header Cache-Control no-cache;
|
||
proxy_pass http://localhost:8922;
|
||
}
|
||
|
||
location ~ /api/kernels/ {
|
||
proxy_pass http://localhost:8922;
|
||
proxy_set_header Host $http_host;
|
||
|
||
proxy_http_version 1.1; # websocket support
|
||
proxy_set_header Upgrade "websocket";
|
||
proxy_set_header Connection "Upgrade";
|
||
proxy_read_timeout 86400;
|
||
}
|
||
location ~ /terminals/ {
|
||
proxy_pass http://localhost:8922;
|
||
proxy_set_header Host $http_host;
|
||
|
||
proxy_http_version 1.1; # websocket support
|
||
proxy_set_header Upgrade "websocket";
|
||
proxy_set_header Connection "Upgrade";
|
||
proxy_read_timeout 86400;
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 3. 多用户配置
|
||
|
||
很多时候搭建了一个服务是给很多人使用的,有些具有私密性或者安全性敏感的,就按需开放,这个时候就需要设置不同的账号密码,而Jupyter没有账号,或者说在哪个账户下运行的服务,账号默认就是这个账户的名字,所以只需将原来的配置文件**jupyter_lab_config.py**复制一个副本,修改设定不同的登录密码以及端口即可,密码的生成有如下两种方式:
|
||
|
||
> **方式1:使用命令行**
|
||
|
||
在命令行中直接运行`jupyter lab password`,会有输入密码的提示,连续输入两次相同的密码,Jupyter就会再次提示你,密码的hash值已经被写入如下文件。然后打开制定的文件,发现是键值对的形式,将其中的值的部分,复制到**/home/manford/.jupyter/jupyter_lab_config.py**配置文件中*c.ServerApp.password*字段。
|
||
|
||
```bash
|
||
[ 0 root@ECX ~]$ jupyter lab password
|
||
Enter password:
|
||
Verify password:
|
||
[JupyterPasswordApp] Wrote hashed password to /home/manford/.jupyter/jupyter_server_config.json
|
||
```
|
||
|
||
> **方式2:使用Python模块**
|
||
|
||
在命令行中输入`python3`之后进入python的控制台环境,然后使用**notebook.auth**模块生成密码,最后和第一种方法一样,将生成hash值形式的密码,填到**jupyter_lab_config.py**配置文件中的*c.ServerApp.password*字段即可。
|
||
|
||
```python
|
||
[ 0 root@ECX ~]# python3
|
||
Python 3.7.3 (default, Jan 22 2021, 20:04:44)
|
||
[GCC 8.3.0] on linux
|
||
Type "help", "copyright", "credits" or "license" for more information.
|
||
>>> from notebook.auth import passwd
|
||
>>> passwd()
|
||
Enter password:
|
||
Verify password:
|
||
'argon2:$argon2id$v=19$m=10240,t=10,p=8$Y+LaIGe/37+rQSFoWgwPUA$7K/vd8b01i7NpZXdQDXK5y1WLysUaNZg/ypz1OBFxX0'
|
||
>>> exit()
|
||
```
|
||
|
||
密码准备好了之后,还有一个地方需要修改,配置文件**jupyter_lab_config.py**中的字段*c.ServerApp.port*值需要修改成和之前端口不一样的值,然后运行`jupyter lab --allow-root --config $PATH-TO-YOUR-CONF`。
|
||
|
||
## 三、使用示例
|
||
|
||
Jupyter Lab作为Jupyter Notebook的升级改造版,除了更加人性化的交互界面以及更多的用户自主定制功能之外,最吸引人的就是其丰富多样的拓展插件,使得每个使用Jupyter Lab的人都可以按照自己所需挑选安装插件,组合出自己心中的完美工作台。如下是安装好打开之后的界面,可以在最左边的侧边栏最后一个按钮处启用并安装扩展程序。
|
||
|
||
#### 1. 界面要素简介
|
||
|
||
如下图所示,Jupyter Lab分为三大块——菜单栏,左侧工作区,右侧启动区。布局比较清晰简洁,多操作几次就可以很熟练地使用了。
|
||
|
||
<center><img src="https://blog.rustle.cc/img/posts/jupyter.png" width="800"></center>
|
||
|
||
#### 2. 编辑/命令模式
|
||
|
||
众所周知,`vim`有编辑模式,命令模式以及视图模式,Jupiter也有编辑模式和命令模式,感觉和`vim`的操作方式大同小异,也是按`ESC`切换成命令模式,相比于`vim`,因为Jupyter是图形界面,编辑模式好理解的多
|
||
|
||
#### 3. 快捷键
|
||
|
||
不仅像`vim`有编辑模式和命令模式,在快捷键的设计方面,感觉Jupyter Lab也和`vim`的设计靠拢,这对于开发者无疑是利好的消息,学习成本可以降低一些。熟练使用快捷键可以一定程度上提高自己的开发效率,降低维护成本,对于一般使用者而言,也仅仅是方便一些。
|
||
|
||
|
||
|快捷键|功能描述|
|
||
|:-|:-|
|
||
|[Insert]<kbd>ESC</kbd>|进入命令模式|
|
||
|[Insert]<kbd>Shift</kbd> + <kbd>Enter</kbd>|运行当前Cell代码|
|
||
|[Insert]<kbd>Ctrl</kbd> + <kbd>Enter</kbd>|运行当前Cell代码|
|
||
|[Insert]<kbd>Alt</kbd> + <kbd>Enter</kbd>|运行当前Cell代码。并插入下一行|
|
||
|[Command]<kbd>A</kbd>|在当前单元格上面插入代码块|
|
||
|[Command]<kbd>B</kbd>|在当前单元格下面插入代码块|
|
||
|[Command]<kbd>Y</kbd>|修改单元格为代码格式|
|
||
|[Command]<kbd>M</kbd>|修改单元格为Markdown格式|
|
||
|[Command]<kbd>X</kbd>|剪切选中的单元格|
|
||
|[Command]<kbd>C</kbd>|复制选中的单元格|
|
||
|[Command]<kbd>V</kbd>|粘贴选中的单元格|
|
||
|[Command]<kbd>↑</kbd>|向上移动以切换单元格|
|
||
|[Command]<kbd>↓</kbd>|向下移动以切换单元格|
|
||
|[Command]<kbd>Z</kbd>|撤销之前的操作|
|
||
|[Command]<kbd>Shift</kbd> + <kbd>Z</kbd>|重做之前撤销的操作|
|
||
|[Command]<kbd>D</kbd> + <kbd>D</kbd>|删除当前行或者选中的行|
|
||
|[Command]<kbd>Shift</kbd> + <kbd>鼠标左键</kbd>|多选单元格,不支持跨行多选|
|
||
|[Command]<kbd>Shift</kbd> + <kbd>M</kbd>|合并多选的单元格|
|
||
|[Command]<kbd>Shift</kbd> + <kbd>Backspace</kbd>|合并当前和其上的单元格|
|
||
|[Command]<kbd>Shift</kbd> + <kbd>Shift</kbd> + <kbd>M</kbd>|合并当前和其下的单元格|
|
||
|[Insert]<kbd>Shift</kbd> + <kbd>Shift</kbd> + <kbd>-</kbd>|以当前鼠标位置,拆分成两个单元格|
|
||
|
||
以上是比较常用的快捷键,更多的操作可以使用<kbd>Ctrl</kbd> + <kbd>,</kbd>打开高级设置,找到**Keyboard Shortcuts**条目查看。
|
||
|
||
|
||
#### 4. 魔法函数
|
||
|
||
使用魔法函数可以简单的实现一些单纯python要很麻烦才能实现的功能,如下是Python Kernel中适用的一些魔法函数,都是一些个人觉得比较常用的。Ipython的魔法命令分*line magic*和*cell magic*两种:
|
||
|
||
- *line magic*:是只针对当前行生效的方法,使用魔法命令时只需要用'%'前缀
|
||
- *cell magic*:是针对当前整个代码输入框生效的方法,使用魔法命令时只需要用'%%'前缀
|
||
|
||
|魔法函数|功能描述|
|
||
|:-|:-|
|
||
|%lsmagic|列出所有魔法命令|
|
||
|%magic|列出所有魔法命令的详细用法|
|
||
|%cd PATH|切换工作目录|
|
||
|%%writefile filename|将当前cell的内容保存到文件|
|
||
|%%markdown|以Markdown渲染当前cell|
|
||
|%%latex|以latex渲染当前cell|
|
||
|%%js|以js渲染当前cell|
|
||
|%%html|以html渲染当前cell|
|
||
|%%bash|在子进程中用bash执行当前cell|
|
||
|%time|%time统计单行python语句的执行时间,%%time,统计当前cell的执行时间|
|
||
|%system|执行shell命令,并且捕获输出|
|
||
|%pwd|查看当前工作目录|
|
||
|%pip|执行pip命令|
|
||
|%matplotlib|%matplotlib inline,在cell 的执行结果中显示matplotlib绘制的图像|
|
||
|%pdef|查看某个可调用对象的接口说明|
|
||
|%pdoc|查看某个对象的docstring|
|
||
|%pfile|查看某个对象在哪个文件中被定义|
|
||
|%load filename|加载代码到当前前端,如%load myscript.py|
|
||
|
||
> 要查看某个魔法命令的用法,可以使用"%{命令名}?",也就是在命令名后加一个问号
|
||
|
||
#### 5. 其他
|
||
|
||
Jupyter Lab还有很多其他的小技巧,有用但是并不复杂,一并汇总在这里。
|
||
|
||
- 按tab键查看提示信息或者补全命令(Lab不需要安装插件)
|
||
- 在一个库、方法或变量前加上`?`,就可以获得它的一个快速语法说明
|
||
- 使用分号可以阻止该行命令或者函数的结果输出
|
||
- 可以用Edit→Clear (All) Output(s)清除已经输出的结果
|
||
- 可以手动拖动Cell以改变单元格顺序
|
||
|
||
> *matplotlib* 中文字体问题
|
||
|
||
网络上以及官方给出了很多解决方案,这里只记录其中一种可以解决问题的方法:
|
||
|
||
1. 在Windows11的"C:\Windows\Fonts"路径下找到一款喜欢的中文字体
|
||
2. 将其复制到一个指定文件夹,比如:/opt/config/font/simhei.ttf
|
||
3. 在代码块中指定引用
|
||
```python
|
||
from matplotlib import font_manager
|
||
my_font = font_manager.FontProperties(fname="/opt/config/font/simhei.ttf")
|
||
plt.xlabel("时间", fontproperties = my_font)
|
||
```
|
||
|
||
|
||
## 四、参考文档
|
||
|
||
- [Project Jupyter \| Home](https://jupyter.org/)
|
||
- [JupyterLab Documentation](https://jupyterlab.readthedocs.io/en/stable/)
|
||
|