Anaconda、Jupyter、Kernel与No module named XXX

案例再现

小蓝开始学习machine learning啦,各种框架各种模型看起来超酷,就想快点拿过来玩一玩,预测个房价走势、手写数字什么的。但是各种环境的安装和相互依赖是个大问题,不小心就手残装废了,只能删档重开XD。现在,Anaconda横空出世,这都不是事儿,赶紧把Anaconda这黄金大锤抡起来。

下载、安装、环境变量设置,conda -V检查一下,最新版anaconda3,一次点亮,安全炫酷,感觉自己棒棒的!开整!

等等,听老人家说过,新手得先搞个虚拟环境,随便玩,玩废了删掉,开新的。So Coooool!虚拟环境装起来!conda create -n env_name python=2source activate env_name,命令行开头出现的(env_name)在欢迎我来到玩家国度,放开了玩!

刚学了文本分词,那我就不客气了,先来一套词云开开眼。不由分说,运转灵巧纤细的手指,小蓝用jupyter notebook熟练的在虚拟环境下打开了Jupyter notebook,新建一个,说是要选kernel,python2还是python3,当然是赶时髦选python3啦(这里埋个坑)。

中文的文本分词需要安装jieba库,那就来一套!conda install -c conda-forge jieba,下载顺利,安装。怎么最后冒了段提示:

usage: conda [-h] [-V] command ...
conda: error: argument command: invalid choice: '/Users/usr_name/anaconda3/envs/ml-py2/bin/conda' (choose from 'info', 'help', 'list', 'search', 'create', 'install', 'update', 'upgrade', 'remove', 'uninstall', 'config', 'clean', 'package')

什么意思?小蓝估摸着是安装失败了,去notebook里面import一下,No module named jieba,没毛病,conda不太好使。换pip!接着又是一顿猛操作,pip install jieba,下载安装successfully,简直崇拜自己。来import一下,No module named jieba,蛤?!不可能!小蓝立刻在虚拟环境中打开python交互界面,import jieba成功了,就说嘛,肯定是Jupyter反应迟钝,关掉重开!一阵折腾,依旧是热情的报错。小蓝凌乱了,简直不敢相信自己的眼睛!

问题解析

  1. kernel是什么?

    A kernel provides programming language support in Jupyter. IPython is the default kernel. Additional kernels include R, Julia, and many more.(术语)根据官方解释,kernel简而言之就是jupyter支持的编程语言环境。

    在上面的案例,新建的ipynb文件是运行在python3的环境中,而需要的jieba库是安装在python2的环境中,所以在notebook中肯定找不到jieba,需要在kernel选项中将kernel切换到python2的环境下。

  2. notebook启动ipynb时,默认kernel是什么?

    新建ipynb文件时,选择的是哪个kernel,每次进入时就启动相应的kernel

  3. kernel和notebook(spyder)是什么关系?

    notebook和spyder都是编辑器,代码python或其他运行需要语言编译环境的支持,kernel中就包含了这个语言环境,不同的kernel可对应不同的环境。

  4. kernel和虚拟环境是什么关系?

    虚拟环境安装的python语言编译环境,通过配置Jupyter下的kernel.json文件,就可以将虚拟环境映射为kernel。

  5. conda创建虚拟环境后,如何新建kernel?

    conda create -n my_env python=3 ipykernel,创建的时候务必要安装ipykernel(如果是R语言,要安装irkernel),ipykernel包的作用是将当前所在python环境添加为kernel,配置文件路径为~/anaconda3/envs/my_env/share/jupyter/kernels/python3/kernel.json

  6. kernel相关操作

    • 查看系统环境kernel:jupyter kernelspec list

    • 自动关联kernel与虚拟环境:创建虚拟环境的同时,安装上ipykernel即可

    • 手动配置kernel:

# 安装ipykernel
conda install ipykernel
# 新建kernel,其python环境指向创建kernel时所在的python环境
# 路径为/usr/local/share/jupyter/kernels/kernel_name
# 配置文件为/usr/local/share/jupyter/kernels/kernel_name/kernel.json
ipykernel kernel install [--name kernel_name --display-name "display_name"]
# 查看kernel
jupyter kernelspec list
# 删除kernel
jupyter kernelspec remove kernel_name
  1. kernel管理

    在系统环境(非虚拟环境)安装以下包,能便捷的管理和切换kernel。

    • 切换kernel用nb_conda_kernelsconda install -c conda-forge nb_conda_kernels

    • 管理kernel用nb_condaconda install -c conda-forge nb_conda

  2. conda不好用?

    这个完全不存在的,与pip同为包管理器,conda与pip只有小部分功能有重叠,如安装python包和配置虚拟环境。pip可以在任何环境中快速的管理python包,而conda需要anaconda环境的支持,但conda很好的处理了包之间的依赖关系,尤其是在数据科学方面。

    案例中conda安装失败(其实是调用jieba失败),是因为在虚拟环境下并没有安装anaconda,conda命令调用的系统环境中的conda,所以失败了。

  3. anaconda和conda是什么关系?

    anaconda是python发行版(发行版就是内置了python相关软件包集合的程序,安装后可直接使用,不需要再单独配置这些包),conda是包管理器(包管理器是便捷的管理工具,用于软件包的安装、升级、卸载等操作,会自动处理包之间的依赖关系)。

    除了anaconda外,发行版还有miniconda,其中只包含了conda管理器,未安装pydata生态圈软件,体积小,方便熟练工按需装载软件。

其他

使用anaconda3自带的jupyter notebook,dataframe默认的输出就没有边框,可视效果很差,在notebook 5.0.0版本中做的更改(来源),有人尝试将notebook降级回4.4版本,懒得折腾,将就看了。

推荐阅读更多精彩内容