目录

    前面提到 Jupyter Notebook 是一个交互式笔记本,支持运行 40 多种编程语言,非常适合教学。最近,学习 Go 语言,就想起了 Jupyter。本文主要描述如何在 Jupyter 里面安装 Python3 和 Go 内核。

    1. Jupyter 安装

    在 CentOS 7 中,默认安装了 Python 2.7,有现成的 Python 环境可用。

    • 安装 Jupyter
    pip install jupyter
    
    • 生成密码

    在 IPython 中,利用 passwd 函数生成密码 sha1 值。

    ipython
    In [1]: from IPython.lib import passwd
    
    In [2]: passwd()
    Enter password:
    Verify password:
    Out[2]: 'sha1:************************************************'
    
    • 生成配置文件

    执行命令,jupyter notebook --generate-config,生成 ~/.jupyter/jupyter_notebook_config.py 配置文件。

    编辑 jupyter_notebook_config 文件,新增如下内容:

    c.NotebookApp.allow_root = True
    c.NotebookApp.open_browser = False
    c.NotebookApp.port = 9999
    c.NotebookApp.password = u'sha1:************************************************''
    c.ContentsManager.root_dir = '/root/jupyter/data'
    

    其中,passwd 为刚才生成的密码 sha1 值,root_dir 为 Jupyter Notebook 数据存放根目录。

    • 启动 Jupyter

    至此,基本就完成了 Jupyter 的安装和配置,可以启动 Jupyter。

    jupyter notebook
    
    • 非 roor 启动时,报错

    如果以非 root 权限启动,会报错:OSError: [Errno 13] Permission denied: ‘/run/user/0/jupyter’。这是由于没有权限所致。只需要在有权限的目录,使用 virtualenv 创建 Python 环境 /home/jupyter/py2

    执行命令,修改 XDG_RUNTIME_DIR 值:

    export XDG_RUNTIME_DIR="/home/jupyter/py2/jupyter"
    

    查看 runtime 路径:

    jupyter --path
    config:
        /root/.jupyter
        /usr/etc/jupyter
        /usr/local/etc/jupyter
        /etc/jupyter
    data:
        /root/.local/share/jupyter
        /usr/local/share/jupyter
        /usr/share/jupyter
    runtime:
        /home/jupyter/py2/jupyter
    

    2. supervisor 托管 Jupyter

    在服务器端运行 Jupyter,为了能够在程序 dump 时,自动拉起,需要将 Jupyter 托管给 supervisor。

    • 安装 supervisor
    pip install supervisor
    
    • 创建配置文件目录
    mkdir -p /etc/supervisor/conf.d
    
    • 创建 supervisor 配置文件
    echo_supervisord_conf > /etc/supervisor/supervisord.conf
    
    • 编辑 supervisor 配置文件

    编辑 /etc/supervisor/supervisord.conf 文件,新增如下内容:

    [include]
    files = /etc/supervisor/conf.d/*.ini
    

    /etc/supervisor/conf.d/ 文件夹下的所有配置文件,都会被导入 。这样是为了方便管理,可以为每个进程或相关的几个进程单独写成一个配置文件。

    • 新增 Jupyter 配置 jupyter.ini

    新增文件 /etc/supervisor/conf.d/jupyter.ini,内容如下:

    [program:jupyter]
    command=jupyter notebook --allow-root
    user=root
    autostart=true
    ;autorestart=true
    ;startsecs=30
    ;startretries=5
    stdout_logfile=/var/log/jupyter/jupyter-access.log
    stderr_logfile=/var/log/jupyter/jupyter-error.log
    
    • 创建日志目录
    mkdir /var/log/jupyter
    
    • 启动 supervisor

    可以简单的执行,启动 supervisor:

    supervisord
    

    也可以指定配置文件启动

    /usr/bin/supervisord -c /etc/supervisord.conf
    
    • 查看状态 supervisorctl

    supervisorctl 是一个用于与 supervisord 交互的程序。通过 supervisorctl ,我们可以完成对托管进程的管理。下面是一些基本的命令:

    # 停止某一个进程,program_name 为 [program:x] 里的 x
    supervisorctl stop program_name
    # 启动某个进程
    supervisorctl start program_name
    # 重启某个进程
    supervisorctl restart program_name
    # 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
    supervisorctl stop groupworker:
    # 结束 groupworker:name1 这个进程 (start,restart 同理)
    supervisorctl stop groupworker:name1
    # 停止全部进程,注:start、restart、stop 都不会载入最新的配置文件
    supervisorctl stop all
    # 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
    supervisorctl reload
    # 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
    supervisorctl update
    # 查看进程状态
    supervisorctl status
    

    3. Jupyter 配置 Go Kernel

    gophernotes 是 Jupyter 的 Go 内核。下图是,配置完内核后,在 Jupyter 中执行 Go 的示例:

    • 安装依赖项

    gophernotes 有四个依赖项:

    1. Go 1.9+
    2. Jupyter Notebook or nteract
    3. ZeroMQ 4.X.X
    4. pkg-config

    在 CentOS 7 上只需安装 ZeroMQ 和 Go, 即可,满足依赖。

    yum install zeromq go
    
    • 安装 gopherdata
    go get -u github.com/gopherdata/gophernotes
    mkdir -p ~/.local/share/jupyter/kernels/gophernotes
    cp $GOPATH/src/github.com/gopherdata/gophernotes/kernel/* ~/.local/share/jupyter/kernels/gophernotes
    
    • 没有加入 PATH,找不到 gophernotes

    错误提示:OSError: [Errno 2] No such file or directory

    ln -s $HOME/go/bin/gophernotes /go/bin/gophernotes
    

    可以按照 GitHub 上面的提示创建软链接,也可以直接将 gophernotes 拷贝到 /usr/bin/ 目录。

    4. Jupyter 配置 Python3 Kernel

    配置完 Go,顺手又配置了一下 Python3 。下图是,配置完内核之后,在 Jupyter 执行 Python3 的示例:

    • 查看可用的 Python3 版本
    yum  search python3
    
    • 安装 Python36
    yum install python36
    
    • 安装 pip3
    wget https://bootstrap.pypa.io/get-pip.py
    python36 get-pip.py
    
    • 安装 kernel
    python36 -m pip install ipykernel
    python36 -m ipykernel install
    
    • widgetsnbextension 没有安装并启用,报错

    前端错误提示,404,找不到 /jupyter/nbextensions/widgets/notebook/js/extension.js

    安装并启动 widgetsnbextension ,即可。

    jupyter nbextension install --py widgetsnbextension
    jupyter nbextension enable widgetsnbextension --py
    

    5. Markdown 增强

    notedown 插件,可以使用 Markdown 创建 Jupyter 笔记,同时支持在线新建、编辑 Markdown 文件。

    • 安装
    pip install https://github.com/aaren/notedown/tarball/master
    
    • 配置

    编辑 ~/.jupyter/jupyter_notebook_config.py,新增如下内容:

    c.NotebookApp.contents_manager_class = 'notedown.NotedownContentsManager'
    

    6. 参考