引言
本人之前使用的Jupyter Notebook基本上就是在软件已安装且环境已配置,确认软件能正常写代码的情况下,写写Python代码完成一些项目,以及必要时切换到Markdown格式下进行文字编辑说明。之前看到网上有程序爱好者的Jupyter Notebook打开.ipynb文件后在代码及Markdown单元格左侧有类似文档目录的效果,这样他们查阅代码或者文字就非常方便。因此本人也尝试对本人电脑上的Jupyter进行类似的设置,主要是通过Nbextensions插件,对其相关功能进行勾选达成目的。期间也遇到了一些技术上的问题,和大家一起探讨一下如何解决相关问题,最终实现效果。
前提
Jupyter Notebook基于Anaconda并能正常使用(指软件已安装,环境已配置,相关.ipynb文件能编写代码并输出合理结果等)
通过终端进入Jupyter Notebook的文件界面,最初的界面主要分为"Files"、"Running"、"Clusters"三部分,如下图展示:

图一 最初的Jupyter Notebook打开界面(任务栏分为三块)
问题提出
最初本人认为可能对于每一个代码文件中的任务栏上有相关的选项可以进行选中设置。然而经过研究却并没有发现图二中类似的界面中可以有相关的设置。如何在目前本人这样的Jupyter Notebook的条件下整合出相关代码文件左侧的目录界面,方便以后工作效率的提高,是此次主要探索的问题。

图二 程序界面上方的任务栏上并没有看到有直接调出目录界面的选项
解决过程
在实际查阅有关问题的资料后,本人意识到相关内容的设定并不依靠上述任务栏,而是需要最初进入的打开界面中(图一),添加Nbextensions插件。那么如何进行相关插件的安装呢?由于本计算机上的Jupyter Notebook是基于Anaconda安装的,此处以conda环境下为例说明。
首先需要进入conda环境。这边利用Anaconda Navigator点击 CMD.exe Prompt下的Launch进入相关终端,需要注意的是,在终端中首先需要选择Jupyter Notebook所在的环境,确保在该环境下进行之后的操作。在终端查看环境的代码为:
conda env list
终端会输出所有的环境名称,从中选择Jupyter Notebook所在的环境。以本人计算机为例,由于只有一个叫"base"的环境,Jupyter Notebook就在其中,因此直接使用即可,如下图三:

图三 本计算机中只有一个叫"base"的环境名称
如何判断目前在哪个环境中?如上图三,红框中最开始第一行的括号,包括红框下的括号中的名称即目前所在的环境名称。若你需要切换到另一个环境中,则需要在类似图三界面的多个环境名称中继续在终端中接下来输入如下代码:
conda activate XXX
其中,XXX就是你需要切换到的环境名。请确保XXX就是Jupyter Notebook所在的环境名,上述指令成功后你会看到终端中一开始的括号就变成(XXX),而非一开始的如(base),说明环境切换了。
接下来就是更重要的部分,涉及解决目录的问题。
(1)扩展包安装
首先是在conda环境下安装Jupyter Notebook的一个叫jupyter_contrib_nbextensions的扩展包。jupyter_contrib_nbextensions包括许多有用的插件和工具,这些工具可以增强Jupyter Notebook中的功能和用户体验,其中包括目录功能,还包括诸如代码折叠、自动补全代码、笔记表情符号使用以及LaTeX公式编辑等等。此部分需要在刚刚配置好环境的终端中输入如下指令:
conda install -c conda-forge jupyter_contrib_nbextensions
输入后终端中的效果如下:

图四 这样第一个扩展包就算安装成功了
(2)扩展功能植入
其次需要安装Jupyter Notebook的一组扩展功能到用户的Jupyter环境中,可以理解为将相关功能植入Jupyter中。同样是在上述环境的终端下输入一行指令:
jupyter contrib nbextension install --user
其中”--user“意味着告诉Jupyter将扩展安装到与你账户关联的用户目录中,而不是系统或全局目录。这种安装方式也就不需要管理员权限,适合在没有管理员权限或不想影响其他用户的情况下使用。
然而在实际操作过程中,相关指令并没有成功,如下图所示:

图五 提示jsonchema可能有问题,有一部分文件没有找到
此时再重新打开Jupyter Notebook的相关界面(指从终端重新打开),会看到文件界面如下图所示,任务栏中有了Nbextensions插件,但功能有限,并不能实现我们想要插进目录的想法:

图六 目前的Nbextensions插件概览
针对扩展功能植入失败的问题,本人查阅了许多资料。通过这些资料,了解到这可能与jsonschema所依赖的isoduration组件未能正确安装或被破坏有关,具体主要解决方案主要分布在以下几种上:
(a)更新jsonschema和isoduration
conda环境中相关指令为:
conda install -c conda-forge jsonschema isoduration
这样主要针对的是相关组件版本不兼容的问题。
(b)重新安装jupyter_contrib_nbextensions
若jsonschema已经是最新的,但问题依旧存在,可以考虑重新安装jupyter_contrib_nbextensions。在conda环境中具体指令如下:
pip uninstall jupyter_contrib_nbextensions -y
pip install jupyter_contrib_nbextensions
(c)检查python依赖环境
这样的问题同样可能是因为pip和conda混用了,导致依赖冲突。可以用pip指令检查:
pip check
若发现jsonschema有依赖问题,可尝试如下指令修正:
pip install --force-reinstall jsonschema isoduration
(d)创建新环境
以上若还不能解决,新建一个干净的conda环境,再执行上述出错的指令。
实际尝试中,本人先用了(a),再用了(b),即更新相关组件之后,再重新安装第一部分的扩展包,最终成功解决了这一问题。具体如下:

图七 更新相关组件

图八 重新安装相关扩展包


图九 图十 扩展功能植入成功
(3)安装配置扩展工具
随后我们还需要安装一个叫jupyter_nbextensions_configurator的配置扩展工具。这个工具能够提供一个浏览器界面,用户可以通过这个界面来启用或禁用各种Notebook扩展(这个功能相当重要,我们创建相关目录就是通过勾选相关扩展功能实现的,下文会提到)。在上述两部分指令成功的基础上,此部分内容实现的conda环境下的相关指令代码为:
conda install -c conda-forge jupyter_nbextensions_configurator
这部分本人这边没有太大问题,直接安装成功:

图十一 配置扩展工具安装完成
(4)启动配置扩展工具
上述(3)的配置扩展工具安装完可能还不能用,需要通过在命令行中启动的方式将其激活。相关代码为:
jupyter nbextensions_configurator enable --user
这部分也没有太大问题:

图十二 配置扩展工具启动成功
此时再重启Jupyter Notebook,会发现在文件界面任务栏上的Nbextensions组件中功能套件已经被成功扩充了。而勾选功能也被激活,因此可以选择我们想要的功能扩充。针对本次想要达成的代码界面左侧的目录功能,需在原先勾选的基础之上,继续勾选"Collapsible Headings"以及"Table of Contents(2)"这两个扩展功能。其中前者可以用作目录的折叠功能,而后者则主要用于自动生成Notebook目录以及实时更新内容层级。

图十三 Nbextensions已经正常运行,在原先基础上进一步勾选图中红框的两个扩展功能,以实现目录自动制作
到这里我们的大部分探索已经完成,打开任何一个想要目录的.ipynb文件,点击任务栏最下方右侧的"Table of Contents"(确保其处于被按下状态)。具有标题的部分(尤其是Markdown内容中的标题文字)已经可以在界面的左侧自动展现出来。

图十四 目录已初步自动生成
目录效果的问题讨论
正如图十四大家可以看到的,目录似乎并没有完全展现出来,具体表现为目录的前半部分似乎不见了。图中直接从”3.6"部分开始“生成”。那这个到底是怎么回事呢?一开始本人怀疑是打开Jupyter Notebook的浏览器的限制,因为本人使用的是edge浏览器,之前版本打开Jupyter Notebook时经常会出现一些bug,而其它浏览器没有。但是经过进一步探索之后,发现这个问题很抽象。每次进入代码Markdown界面后,自动生成的目录都会只显示下面的一半,此时只需要用鼠标左键在目录的这块区域往下拖动(注意是拖动,而不是仅仅点击),即可把完整的目录界面展示出来。

图十五 完整的目录通过在区域内向下拖动是可以展现出来的
原来不是目录的前半部分没有生成啊,而是完整的目录可能因为什么原因“藏”了起来。只是每次进入相关界面后都需要重新将目录往下拖动一下,也是蛮神奇的。
541

被折叠的 条评论
为什么被折叠?



