当你使用不同的包管理器安装相同的包,可能存在冲突,比如安装jupyter notebook在本地运行,你可能会遇到这种错误:
TypeError: create.<locals>.Validator.__init__() got an unexpected keyword argument 'registry'
甚至你可能用了mamba,当然这是对conda的替代,但是可能会引起包管理冲突的问题,尤其是在base环境中,所以最好是能做到环境隔离;
既然现在出现了这个问题,先解决base环境中包管理冲突的问题,再解决在隔离的环境中使用jupyter的问题;
conda|mamba list >>
ipykernel 6.29.5 pypi_0 pypi
ipython 8.26.0 pypi_0 pypi
ipython_genutils 0.2.0 pyhd3eb1b0_1 defaults
ipywidgets 8.1.3 pypi_0 pypi
jupyter 1.0.0 pypi_0 pypi
jupyter-client 8.6.2 pypi_0 pypi
jupyter-console 6.6.3 pypi_0 pypi
jupyter-core 5.7.2 pypi_0 pypi
jupyter-events 0.10.0 pypi_0 pypi
jupyter-lsp 2.2.0 pypi_0 pypi
jupyter-server 2.14.2 pypi_0 pypi
jupyter-server-terminals 0.4.4 pypi_0 pypi
jupyter_client 7.4.9 py310h06a4308_0 defaults
jupyter_core 5.3.0 py310h06a4308_0 defaults
jupyter_server 1.23.4 py310h06a4308_0 defaults
jupyterlab 4.2.3 pypi_0 pypi
jupyterlab-pygments 0.2.2 pypi_0 pypi
jupyterlab-server 2.27.2 pypi_0 pypi
jupyterlab-widgets 3.0.11 pypi_0 pypi
jupyterlab_pygments 0.1.2 py_0 defaults
nb_conda_kernels 2.3.1 py310h06a4308_0 defaults
nbclassic 0.5.5 py310h06a4308_0 defaults
nbclient 0.10.0 pypi_0 pypi
nbconvert 7.16.4 pypi_0 pypi
nbformat 5.9.2 py310h06a4308_0 defaults
ncurses 6.4 h6a678d5_0 defaults
nest-asyncio 1.5.7 pypi_0 pypi
notebook 7.2.1 pypi_0 pypi
notebook-shim 0.2.3 pypi_0 pypi
黑体部分是pip list里没有的;
可以看到两个版本同时存在,导致了问题,有可能是因为我把另一个环境的复制到base引起的,我们先验证下这个推测:
切换到另一个terminal,history 75才找到之前这条命令(加上另一个终端的命令,感觉今天尽在折腾环境的事了,这块虽然自己熟悉了命令,但是敲之前还是问问自己为啥要执行这些命令,参考下别人的解决方案):
find /home/miniconda3 -name "jupyter*"
激活找到的环境A,再用pip检查版本,看是否和上述的重复的版本一致;
发现只有
jupyter_core 5.3.0 py310h06a4308_0 defaults
jupyter_server 1.23.4 py310h06a4308_0 defaults
jupyterlab_pygments 0.1.2 py_0 defaults 三个和环境A中的一致
其他两个不一致不知道怎么引起的;
本着失败是成果之母的信念,还是要分析为何一再出这种错误,之前在windows的anaconda里装过jupyter,在Ubuntu20.04里也装过,现在是在22.04里又折腾,重装是因为换设备或者原来的虚拟机出了问题或者占空间,但是每次都这么折腾,主要还是没有理清一个处理流程,也不擅长去借鉴成熟的方案,因为在科研上来说,别人已经解决过的问题,我们再去解决,是除非能比人家做得更好的,所以这里,还是要重新思考下:
固定一些原子操作:先uninstall再install;
走完一个流程再开始下一个任务:对于习惯多任务的人来说,容易被后续的任务打断,但是还是要注意保存之前的这个处理了一半的状态,在涉及操作系统的问题上尤其如此,否则,问题叠加,非常难以处理
注意冲突操作相互隔离:conda管理;
先卸载base里冲突的包:
conda uninstall jupyter_client==7.4.9(想当然写得,语法有误,导致提示的问题看着很严重)
Collecting package metadata (repodata.json): failed
。。。此处省略n行
An unexpected error has occurred. Conda has prepared the above report.
If you suspect this error is being caused by a malfunctioning plugin,
consider using the --no-plugins option to turn off plugins.
Example: conda --no-plugins install <package>
以上错误之前遇到的时候,就是自己夺命连环扣命令,可能也没注意命令本身的正确性和是否存在包的版本冲突和管理冲突的问题,不知道是不是导致什么类似数据库死锁的事情发生,这只是又一个猜测;
conda remove jupyter_client=7.4.9
这次删掉了,go on!
因为这么折腾真的很漫长,conda虽然自动化做得好,但是检查时间感觉有点慢;
所以最好就是相应的习惯都改改,如果用其他的安装方式,是为了什么,速度更快,比如直接从另一环境复制?会有什么影响,安装之前先检查之前是不是处于正确的状态;
到这一步终于解决了base环境中的jupyter的问题,接下来就是代码运行里的bug了;
更进一步地,如何在其他conda环境里使用jupyter内核,参见:
【最全指南】如何在 Jupyter Notebook 中切换/使用 conda 虚拟环境?_多个conda环境 notebook用的哪个-CSDN博客
jupyter AttributeError: module 'mistune' has no attribute 'BlockGrammar'
这种什么模块没有什么属性的似乎是版本的问题,update以下应该能解决
至于之前遇到的什么 “Jupyter notebook reported error 500 : Internal Server Error because nvconvert and pandoc version conflict, what are the solutions?”也是先查版本,这里涉及一个包:
安装 nbconvert(转换jupyter notebook)-CSDN博客
另外,之前是在一个有tensorflow-gpu 和 mmengine的环境里装的jupyter notebook,可能是由于注重性能和注重可视化的软件对typing_extensions这类软件的需求不同,所以后者的安装导致前者的依赖要求不满足了,这块还是要注重环境的隔离;
我个人是很喜欢jupyter的小格子的,但是他的报错那一片红搞得我很紧张,而且字体看着也比较不连续,感觉可读性略有折扣;所以还是喜欢pycharm里打开的jupyter notebook,之前有此做数值计算的实验调过一次,但是忘了怎么搞的了,导致还是重新折腾了base环境里的jupyter;
这么一分析,就不会卡在这个忘了怎么解决的问题上了,其实按说也可以不在本地搞jupyter的,但为啥还是折腾了这一套,就是为了在调用项目里的代码和数据的时候都可以直接用,包括计算资源也不会受限于云端的什么时间限制,和更新了如果不保存就一刷新没了,不过这么看来,似乎还是没做完,因为还是在base环境里;不在一个环境,就算在本地也不能导入一样的包,其实还是相当于在云端,只不过就是能用本地的资源而已,这么说还得折腾下怎么在其他conda环境调用jupyter,毕竟不能只是搬运过来了而已;
所以打开一个先用用看,执行了一个cell,发现报错是关于matplotlib的,但其实base里有着包,由于我们的目标是换一个环境看能不能在一个相对隔离的环境里使用,如下:
在这里可以选择你的kernel,然后第一cell的问题就解决了;
现在终于有种debug是在升级打怪玩游戏的感觉了,也许这就是解决问题自身带来的奖励机制吧;
但是还是感觉有点折腾,其实你用了IDE,人家就已经实现了这部分的功能,比如python console其实就类似这样,只不过你需要把已有的ipynb自己转一下格式,或者复制过来啥的,其实这么看似乎也没必要自己搞这么一下,但是毕竟还是不一样,可读性还是很重要的,包括操作的灵活性,而且python console里的代码应该很难导出或者保存吧,所以还是jupyter好用;