jupyter notebook(原ipython notebook)踩坑记
写在前面
很久没更新了啊,终于腾出时间来更新一波。之前一段时间在部署网站的文档、持续集成和笔记的子站点,其中作为笔记本届久闻大名的名产品 Jupyter 自然是不能放过,由其是其 python 和 markdown 无缝结合的特性,不得不说十分吸引人,让人有一种立马想入坑的冲动,然而就是这个冲动坑了一整天的时间……不过最后还是布置好了,这是后话。
软件安装
安装一个软件,官网怎么能少了呢?要做的事情当然是前往官网了,在官网中发现两种安装方式:官网推荐的,这种是安装集成了众多科学计算工具的 anaconda3 ,其中就集成了jupyter notebook。后一种是自己安装的 python ,通过 pip 安装 jupyter。 作为爱折腾的、有洁癖的典型,前一种全家桶式还要捆绑 conda 的安装方式对我来说简直令人发指,笑~当然选择自己安装了。毕竟不能你说要我安啥就安啥,官网的推荐很重要,我的选择权也是很重要的么。 官网信息表明,jupyter 可以安装在 python2 或者 python3 上。考虑到一个人的命运,不仅要靠个人的奋斗,也要靠时代的进程这一主要因素,以及本地化支持等其他小原因,当然选择 python3 了。但是,众所周知的事情是:在当下的诸多系统中,依赖 py2 的很多,比如笔者的 centos7 的包管理软件 yum 以及进程监控软件 supervisor 就依赖 python2 ,如果直接二进制安装 python3 ,容易覆盖环境变量,虽说可以通过自己改写 yum 文件的开头来解决,但是每次 yum 升级就要重新改也是相当麻烦。 于是,笔者选择源码安装。
正式开始
切换到工作目录,使用 wget 下载 python 官网的 python3 源码资源,解压,并进入对应目录。
|
1 2 3 4 5 |
cd /your/workdir/absolute/path/ wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz tar -vxf Python-3.6.2.tgz cd Python-3.6.2.tgz |
注意
- 如果没有wget的请先安装
yum install wget -y - 请将
3.6.2和Python-3.6.2.tgz换成你需要的对应版本。
编译安装
|
1 2 3 4 |
./configure --prefix=/usr/local/python3 make make altinstall |
指令说明
configure的--prefix=选项后接要安装到的绝对路径,其实还可以开启优化,用几倍的安装时间换效率的10%左右提升,笔者这里就没选了,可以自行尝试。- 使用
make altinstall而不是make install可以避免自动生成\bin文件夹中快捷方式等自动改变环境变量的方式,便于我们后续自己配置。
配置环境
|
1 2 3 4 |
ln -s /usr/local/python3/bin/python3.6 /bin/python3.6 ln -s /usr/local/python3/bin/python3.6 /bin/python3 ln -s /usr/local/python3/bin/pip3.6 /bin/pip3 |
指令说明:设置由python3安装文件夹可执行文件到/bin文件夹的软链接(/bin文件夹一般默认属于环境变量搜索路径,相当于windows的桌面(误);软链接相当于windows的快捷方式),其他诸如easy_install也可以照此配置,注意不要覆盖掉/bin/python和/bin/pip他们一般指向python2而很多软件需要。
安装jupyter
|
1 2 |
pip3 install jupyter |
尝试使用
环境配置
jupyter notebook除非设置允许root权限用户运行,否则是不允许root权限乃至sudo权限下运行的。 先在root或sudo权限下新建jupyter notebook的笔记储存目录,将该文件夹权限给予工作账户,切换至工作账户
|
1 2 3 4 5 6 7 |
mkdir -p /your/jupyter/notedir //换成你的目录 chown www:www -R /your/jupyter/notedir //-R前面换成你的组和用户,后面换成你要修改权限的路径 su www //笔者的工作账户,接着输入密码 |
注:
- 没有工作账户,请通过
useradd -d \home\yourUserName -g yourGroupName yourUserName的方式新建账户。 - 无法进入指定账户,且显示
This account is currently not available,可以使用指令vipw、i将对应用户后的/sbin/nologin改为/bin/bash,依次按esc,:,w,q,enter保存。 - 请确保你知晓该用户的
home目录,可以使用指令echo ~yourUserName查看,若指向/dev/null目录,请使用usermod -d /home/yourUserName yourUserName修改到一般的home目录,并使用chown指令将此文件夹权限归属于该用户。
软件配置
天真的我,当时竟然就以为配置好了。软件默认本地8080端口,由于我是远程主机,设置了一下nginx从个人域名到127.0.0.1:8080的proxy_pass。 切换到jupyter程序目录,一般是cd /your/path/python3/bin/。按以下指令启动:
|
1 2 |
jupyter notebook |
打开后,发现竟然是token登录,而我由于nginx反向代理的原因,路径中的token已经消失了,果断ctrl+c中断程序。 在官网查询一番后,知道了用jupyter notebook password然后键入你的密码,软件会在/home/yourUserName/.jupyter/jupyter_notebook_config.json生成hash后的你的密码,将它复制,打开/home/yourUserName/.jupyter/jupyter_notebook_config.py将它复制到password选项后。 此时可以顺带修改一系列选项,如可以修改port开放的端口号,ip开放的ip,如果是远程使用,建议ip改为\*。c.NotebookApp.notebook_dir改为你创建的/your/jupyter/notedir的相对于/your/path/python3/bin/的相对路径。 再回到/your/path/python3/bin/,启动jupyter,此时你可以用密码远程登录jupyter了。
小坑
前面已经说过我是远程主机了,当然不能总是把远程shell开着保持服务吧,用nohup指令放在后台,万一以外重启还是得手动比较麻烦。所以我决定用supervisor来保持启动(这里不再详述,大家可以去查)。可能有人会问我为啥不用centos系统自带的systemctl —— 好吧,这指令我只会用,不会写配置文件。 经过一番坑爹的操作,我发现对于jupyter,配置文件最好这样写
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[program:jupyter] directory=/usr/local/python3/bin/ //改为自己的目录 command=/usr/local/python3/bin/jupyter notebook //改为自己的目录 autostart=true autorestart=true startsecs=10 stdout_logfile=/www/web/note_evernightfireworks_com/log/stdout.log //改为自己的目录 stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stdout_capture_maxbytes=1MB stderr_logfile=/www/web/note_evernightfireworks_com/log/stderr.log //改为自己的目录 stderr_logfile_maxbytes=1MB stderr_logfile_backups=10 stderr_capture_maxbytes=1MB user = www environment = HOME="/home/www/", USER="www", PATH="/usr/local/python3/bin/" //改为自己的目录和用户 |
保存后将该配置文件添加到 /etc/supervisord.conf 的include目录后,然后就是顺利的
|
1 2 3 4 |
supervisorctl reload; supervisorctl update; supervisorctl start jupyter; |
启动了 巨坑 前面又说过由于我是用nginx反向代理了本地端口,所以我直接用域名登录的,没有加端口号。 结果就是怎么样都在笔记本里连接不上 python 解释器,无论是 cython 还是 ipython ,我花了一下午,查边 stackoverflow , quora, 知乎 ,csdn 也没有找到解决办法,无论如何都不行,最后漫无目的地在官网的文档的一个连接页的小犄角旮旯里发现了这么一句话, 
