背景
今天遇到了一个问题:当我加载了某个虚拟环境(virtualenv)后,确认了在bin/activate
预先设置的环境变量已经生效,于是打开jupyter notebook:
jupyter notebook --port xxx --ip 10.10.xxx.xx
但是打开notebook之后通过os.getenv(‘LD_LIBRARY_PATH’)发现上述生效的环境变量在notebook却不见了,从而使得需要import的包中某些动态连接库找不到。
原因排查
尝试通过os.environ[‘LD_LIBRARY_PATH’]来将环境变量加进去,但发现依然会存在找到动态连接库的问题。通过一系列的查证,发现关键在于:notebook的环境变量需要通过内核来指定。内核简单来说就是,notebook所用的,用于解析当前程序的python版本(比如python 2或者python3,系统本身的还是通过虚拟环境搭建的……)
首先,我们可以通过jupyter kernelspec list
来查看系统目前都有哪些kernel可供使用:
$ jupyter kernelspec list
Available kernels:
python3 xxxx//share/jupyter/kernels/python3
python2 xxxx
上述表明我目前在jupyter中有2个kernel,其中一个是通过虚拟环境搭建的,名称为python3
另一个是系统本身的,名称为python2。kernel的删除可以通过jupyter kernelspec remove xxx(名称)来实现。Kernel的管理非常关键,我总结下来大部分环境的原因都是因为kernel没有用对。假如我需要在python3这个kernel跑我的程序,我需要在这个kernel对应的配置文件,也就是xxxx//share/jupyter/kernels/python3/kernel.json中加入相关的环境变量,如:
{
"argv": [
{
"argv": [
"python",
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"display_name": "Python 3",
"language": "python",
"env": {
"LD_LIBRARY_PATH": "xxx:xxx"
}
}
设置完之后,如需使用jupyter notebook, 需要重启notebook并且在notebook之后选中上述设置好的kernel。
更多
- 目前VSCode中对jupyter notebook还算友好,但是还是缺乏对Kernel的管理,其默认的做法是在里面直接新建很多个kernel,然而这些Kernel的环境变量都是初始值,所以建议启动notebook的时候不要用VSCode
- 取而代之的做法是通过terminal建立(也就是
jupyter notebook --port xxx --ip 10.10.xxx.xx
),然后在VSCode中打开相应的kernel URL
最后
以上就是感性奇迹最近收集整理的关于Jupyter Notebook多版本共存(Kernel的管理)的全部内容,更多相关Jupyter内容请搜索靠谱客的其他文章。
发表评论 取消回复