【问题记录】新conda环境的notebook不能渲染html样式以及改用切kernel的方法不能import库
背景和引出的问题
- 关于anaconda:之前学的时候不想总开虚拟机,发现nvidia的cuda和cudnn在windows系统下也可以搞,就直接在主机上配了。加上听说在windows下用conda管理更好(但用着其实也就那样,但没啥大毛病就一直用着),就主机上装了个anaconda,用它的notebook
- 关于环境:有很多工具的版本不一样用起来会有很大区别,比方说TensorFlow1.x执行之前要搞个图然后创建session才能执行训练,2.x就不这么搞了有eagerExecution机制。所以,当时我装TensorFlow和pytorch是在conda的虚拟环境里装的,遇到问题之前我有base和TensorFlow和pytorch三个环境。
- 莽夫行为1:当时不了解jupyter notebook可以切kernel,每个环境都装了一个notebook。
- 莽夫行为2:最近想看以前的内容更方便一点,因为notebook本身支持markdown,但是功能不是特别全,比如不能按照标题显示目录,嵌入markdown的html代码的颜色和css样式这些东西都渲染不好,这就需要插件nbextension,然后我在3个环境里装了3遍这个插件。然后这个插件的安装我不得已用了pip,因为它官方文档给的方法是pip,而且之前用conda装我发现装完了功能不全选项只有4个,正常会有很多很多。pip和conda两个交替用要出问题的。因为虽然是在环境下执行的pip install命令,但pip它不认识conda环境,conda的东西有时候也认不出来明摆着被pip装在自己环境里的东西,比如下面问题A,
- 问题A(小问题):markdown对于样式的支持来说不太丰富,所以有的地方想高亮要嵌入html,除了base环境之外,另两个环境都渲染不出来我的html代码样式。
base环境下
另两个环境
我记得渲染html样式的东西是nbextension顺带装的,那我根据这个现象自然想到了上面装nbextension的时候的行为。 - 解决上一个问题之后蹦出来的问题B(大问题):认真研究了一下上一个问题,我发现notebook可以切kernel的,只要在每个环境里装ipykernel,然后对应添加一下(用python -m ipykernel install --name --user 再接环境名就好了),就能在notebook里用了。这样装一个notebook就好了不用在每个环境里装一遍,然后我最近就重配了,这样好了,我在base环境里开notebook,要用其他环境里面的工具,切到其他环境的kernel就好了(下图第二三四个kernel是执行了下面解决问题的措施之后才有的,也是解决问题的办法)
base环境的notebook渲染html样式也没问题,皆大欢喜。
然而
各种在jupyter notebook里import的时候不能import,告诉我缺dll,查这些dll有的是属于numpy
的有的是属于mkl
的,但我都是装了的,而且,在环境里开python命令行运行没有说缺dll也没有在import的时候报别的错,下面这样,能正常import。
问题分析和解决
那就是说,虽然切了kernel,但是它没去对应的环境里给我找那个环境里的库,而是在base环境也就是jupyter notebook安装的环境里找库,当然是import不了了。
寻找这种现象的解释,网上大多都是缺什么dll就让装对应的啥,但显然是对于我这个问题不合理的,我本质是不缺的,只是jupyter notebook觉得我缺,或者说它特意去缺的那个环境里面去找。
后面终于找到一个讲这个现象的博主,但是有可能是我知识还没有储备到理解这里面的逻辑关系的程度,也有可能是这位博主并没有想要分析原因而只是描述现象,总之,我没看懂他说的原因,附上原文
由于使用anaconda下激活的环境是python38后打开的jupyter,所以在jupyter notebook使用
!pip install XXX
后安装的包的路径都是在对应环境下。但是对包进行import的时候,查找的路径是jupyter 默认的kernel而非激活的环境。
原文链接:https://blog.csdn.net/secular_/article/details/116022708
这位博主介绍了解决办法的确是对我有用的,即安装工具nb_conda_kernels
还挺好装的,conda install
就可以,然后重启notebook就能在kernel列表里看到新增的对应环境的kernel
用这几个就好了
总结
- 不了解jupyter notebook的kernel机制的时候,在每个环境里装了一遍,虽然不合适,但是当时能凑合用。
- 最近想要美观,又知道了kernel这个东西,于是把虽然不合适但能凑合用的东西推翻了。
- conda没有那么厉害,有的时候会报莫名其妙的错,不想花大把时间想它为什么这么莫名其妙,就得用pip。比方说(下面这个错不准确,凭记忆写的)
numpy should >=1.17 <=1.23, your version is 1.19
,就是这种明摆着的让人无话可说的error信息,我的version是1.19满足你那个区间,它说,版本应该在啥啥区间,你这个不行,还给我的版本显示一下。太有趣了。这个时候用pip就在所难免,而且conda报的这种不能装的错,放人家pip那就没问题。 - 但是用了pip装的库,用在conda环境的notebook里面切到那个kernel再写python代码
import
,import的时候多半会报错,import不了。 - 这个时候需要插件
nb_conda_kernels
,用了对应环境的kernel它就在那个环境的路径下找,就能找到了。
以上