USAGI NOTE | 木星进化理论

> U酱收藏了一篇笔记,小兔报告说。
> 据小兔观察,主要的内容是:
> Jupyter Notebook / Lab环境的折腾记录。


首先,木星是Jupiter,而今天的主角是Jupyter
不过活性酱寻思这也没差多少,就这样8

按活性酱的理解,Jupyter这种一个一个细胞的设计
最合适初学的玩家反复订正代码块了
还有markdown和shell嵌入也很好
总之好处都有啥,谁说对了就给她

Lv0 在本机玩Jupyter Notebook

其实这并不是活性酱最开始的做法,
不过和别的部分关联比较小,
所以还是单独拿出来说说吧

首先嘞,Python总是要装一个的,
pip组件也要一起装上,
然后开出一个管理员的抛瓦Shell其实cmd也行

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
python -m pip install -U pip
pip install -U jupyter

注意在PS/cmd下绝对不可以执行pip install -U pip
因为Windows中运行pip就会占用自身
然后导致更新后的pip放不进去
这就算了吧,删除却还是能删除的
于是pip自爆了,只能手动重新安装

安装完之后,离开管理员的抛瓦,
开一个正常的,然后执行:

jupyter notebook

之所以强调离开管理员窗口,
是因为Jupyter默认使用的根目录就是运行目录
如果在管理员抛瓦下运行
就会跑到system32目录去
虽然Jupyter已经自动隐藏了系统文件
但这样的操作终究还是太危险了
而且跑点Python也用不着管理员权限嘛

想要到指定目录而不是用户目录的话,
好好利用Shift+右键吧
什么 你在cd……

其实,既然已经是在Windows上了
不妨把图形界面发挥到底
VS Code的Python插件现已支持jupyter
只要用它打开ipynb文件,
就会自动加载Notebook视图

VS Code它不香吗

唯一不好就是打开新的文件时
会先出现源代码,
又在右边开出一个Notebook视图
然后关闭原来的标签
过程看上去很生硬

但是,不用打命令行了,又有谁不说好呢 :)

Lv1 Simple but work的在线运行

比如说嘛,手里有个树莓派的话
把Jupyter挂在上面运行不是很好么
假设树莓派的域名是raspberrypi.local
而Jupyter运行在/jupyter目录下

这里可以用一下venv模块
使得Jupyter使用的包和系统隔离
同时也应该建立一个非特权用户
来负责服务端的运行

因为服务端本来就会产生一个.jupyter
所以活性酱干脆把venv也命了同一个名字
目前为止还没造成任何不良影响

apt install python3-venv -y
useradd -s /bin/bash -m venv
su - venv
python3 -m venv .jupyter
source .jupyter/bin/activate
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -U pip
pip install jupyter

先造出一个配置文件jupyter notebook --generate-config
然后编辑.jupyter/jupyter_notebook_config.py
在末尾增加以下参数

c.NotebookApp.allow_origin = '*'
c.NotebookApp.base_url = '/jupyter'
c.NotebookApp.notebook_dir = '/home/venv/jupyter_root'
c.NotebookApp.open_browser = False
c.NotebookApp.password = 'sha1:seyanasoyanasorenaarena'
c.NotebookApp.quit_button = False

关于c.NotebookApp.password,源文件的注释是这么写的

## Hashed password to use for web authentication.
#  To generate, type in a python/IPython shell:
#    from notebook.auth import passwd; passwd()
#  The string should be of the form type:salt:hashed-password.

活性酱的偷懒路线是这样的——

  • 在vim命令模式用/passwd查找并复制好这一行
    from notebook.auth import passwd; passwd()
  • 在命令模式下打出 UMB式密码生成
    :!uuid|md5sum|base64;python3
    有些系统的命令是uuidgen,TAB请
  • 执行,此时输出第一行是很长的一段字母数字混合字符串
    然后是Python的交互式命令行
    粘贴刚才复制的代码并执行
    出现Enter password:的询问
  • 从上面的字符串选择一段看得顺眼的
    粘贴回车 粘贴回车
    得到hash好的密码字符串
    随便开个记事本,或者Win+R
    总之把密码原文暂存一下
  • 把hash好的字符串复制起来
    回vim粘贴保存退出一气呵成
  • 创建配置文件中写的文件根目录
    这里是mkdir ~/jupyter_root
    打开tmux,载入venv
    最后运行jupyter notebook

正确无误的话,就会出现如下的输出

[I 23:11:06.931 NotebookApp] Serving notebooks from local directory: /home/venv/jupyter_root
[I 23:11:06.931 NotebookApp] The Jupyter Notebook is running at:
[I 23:11:06.932 NotebookApp] http://localhost:8888/jupyter/
[I 23:11:06.932 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

此时可以访问http://raspberrypi.local:8888
并把刚存的密码打进去测试一下,顺便记住

如果是用公网服务器的话
就必须部署https才行了
活性酱继续用Apache :)
并且假定域名是example.org
这里主要注意的是
Jupyter有两个路径监听WebSocket
Apache不安装相应模块的话
就无法正常工作

a2enmod proxy_http
a2enmod proxy_wstunnel
service apache2 restart

然后我们来为难Apache配置文件

cd /etc/apache2/sites-available
cat 000-default.conf|grep -Ev '$^|#' > example.conf
vim example.conf

活性酱喜欢一个d$把ServerAdmin杀了
改成ServerName example.org
然后加入反向代理配置

    # Jupyter Notebook begin
    <Location /jupyter/api/kernels >
        ProxyPass ws://localhost:8888/jupyter/api/kernels
        ProxyPassReverse ws://localhost:8888/jupyter/api/kernels
    </Location>
    <Location /jupyter/terminals/websocket >
        ProxyPass ws://localhost:8888/jupyter/terminals/websocket
        ProxyPassReverse ws://localhost:8888/jupyter/terminals/websocket
    </Location>
    ProxyPass /jupyter http://localhost:8888/jupyter
    ProxyPassReverse /jupyter http://localhost:8888/jupyter
    # Jupyter Notebook end.

经过service apache2 reload
就可以访问http://example.org/jupyter
到这一步要部署https就极其简单
certbot随便涂两笔就好了

Lv2 加载成systemd服务

如果打算长期使用下去
就会想让Jupyter开机自动运行
而注册成服务是最有效的办法了

不过首先想到的一个重点就是
v e n v
要如何让服务继承环境变量
从而正确找到虚拟环境的包呢

有部分资料这样说
只要负责执行jupyter
是虚拟环境内的python就行了
对应的写法也就是

ExecStart=/home/venv/.jupyter/bin/python /home/venv/.jupyter/bin/jupyter-notebook

好吧,看起来挺像样的,
但是实际用起来却有一些问题
虽然开启终端和激活虚拟环境后
安装的包能被正确找到
但如果在区块里使用!cmd格式的话

!pip install some-package
会出现权限错误
!pip install some-package --user
安装的包无法被找到
所以呢,还是完全模拟出执行activate更好些

#/lib/systemd/system/jupyter.service
[Unit]
Description=Jupyter Notebook (venv)

[Service]
Type=simple
WorkingDirectory=/home/venv
ExecStart=/bin/bash --login -c 'source ~/.jupyter/bin/activate; jupyter notebook'
User=venv
Group=venv
Restart=always

[Install]
WantedBy=multi-user.target

一个注解:WorkingDirectory=酱会影响开启终端的初始路径
所以这里设为了venv的家目录
另外如果出现OSError: [Errno 99] Cannot assign requested address
而端口并未被占用的话,加上--ip=0.0.0.0

Lv3 在Notebook上加载插件

参考资料:jupyter_nbextensions_configurator
jupyter_contrib_nbextensions
大家跟活性酱一起做
首先切进虚拟环境→

pip install jupyter_nbextensions_configurator jupyter_contrib_nbextensions
jupyter contrib nbextension install --sys-prefix
jupyter nbextensions_configurator enable

然后重启jupyter服务
就可以看到多出了东西

然而 默认都是不让启用的

默认只有完全不影响环境的插件可以启用
几乎就没有嘛(小声)
反正只是个虚拟环境,
已经没有什么可怕的了
大胆取消勾选吧

至于应该启用什么插件
稍微百度一下「 jupyter 扩展 」
就有各路推荐啦
总之自己用着舒服就好了

Lv4 初探Jupyter Lab

Jupyter Lab是Notebook的下一代产品
想体验也是非常简单,把它和notebook装在一起
然后修改一下程序名就可以了
Lab需要4.3版本以上的Notebook
jupyter notebook --version看一下就好
没问题的话

pip install jupyterlab

Notebook版本大于5.3的话这边就算好了
然后override一下服务配置文件就行了
systemctl edit jupyter.service

[Service]
ExecStart=
ExecStart=/bin/bash --login -c 'source ~/.jupyter/bin/activate; jupyter lab'

其实就是把notebook换成lab
然后service jupyter restart
重新进去就会看到变高端了好多

暗色大法好

其实此时把网址结尾的lab改成tree
依然是可以回到notebook视图的
已经没有什么好怕的了 ×2
勇敢者有🦀吃

Lv5 为Jupyter增加更多的内核

活性酱只是顺便一提
https://github.com/jupyter/jupyter/wiki/Jupyter-kernels
这里有超多的内核和各自的文档
如果想学Python以外的语言
就快快行动弄一个内核下来吧

点赞
  1. yyy说道:

    前排支持活性酱~ ୧(๑•̀⌄•́๑)૭

发表评论

电子邮件地址不会被公开。必填项已用 * 标注