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视图

唯一不好就是打开新的文件时
会先出现源代码,
又在右边开出一个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以外的语言
就快快行动弄一个内核下来吧