This repository has been archived on 2023-11-13. You can view files and clone it, but cannot push or open issues or pull requests.
blog/_posts/2022-09-09-jupyter_notebook_lab.md
2023-06-03 15:58:09 +08:00

245 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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/)