获取当前 jupyter-lab 笔记本名称 [for Jupyter-lab version 2.1 and 3.0.1 and notebook version >6.0.3)

Get current jupyter-lab notebook name [for Jupyter-lab version 2.1 and 3.0.1 and notebook version >6.0.3)

问题

大家好,

正如我的标题所暗示的那样,我想以变量的形式访问笔记本名称(在 jupyter-lab 中)。所以我可以在笔记本本身中重复使用它(例如命名笔记本中生成的一些图形文件)。

我看到类似的问题在几年前就已经打开了[see here]。但是我没有找到满意的答案。

我喜欢the answer suggested by @bill的简洁:

import ipyparams
currentNotebook = ipyparams.notebook_name

但是,它对我不起作用。我第一次执行第一个单元格时收到此警告:

import ipyparams
Javascript Error: Jupyter is not defined
currentNotebook = ipyparams.notebook_name
currentNotebook
   ''

然后,如果我再次重新运行 单元格,我就不会再收到警告消息,但变量 currentNotebook 仍然是空的。 (我运行单元格顺序,我没做'Run All Cells')。

配置详情

我的 Jupyter 版本是

jupyter notebook --version                                                                            
6.0.3]

jupyter-lab --version                                                                                 
2.1.1

我的笔记本主要用于 python 代码。


编辑 2021 年 1 月 27 日

@juan 解决方案 [], using ipynbname 适用于

jupyter-notebook : 6.1.6
jupyter lab : 2.2.6

但此解决方案仍然不适用于 jupyter lab : 3.0.1


编辑 28/01/2021

ipynbname 现在正在为 jupyter 3 工作

更多详情[here]

您需要将导入代码放在函数上方的单独单元格中 (ipyparams.notebook_name)。否则它会尝试 运行 库完全加载之前的代码,所以 currentNotebook 变量仍然是空白。将导入内容放在自己的单元格中会强制它在移动到单元格 #2 之前加载。

作为替代方案,您可以使用以下库:ipynbname

#! pip install ipynbname

import ipynbname
nb_fname = ipynbname.name()
nb_path = ipynbname.path()

这对我有用,而且解决方案非常简单。

对于那些缺少 ipynbname 的人,这个 JavaScript hack 将用于获取 Jupyter notebook 文件名和路径并将它们保存到 Python 可访问的变量中。但是,您无法在使用 运行 JavaScript 代码的同一单元格中访问这些变量。所以如果你想对变量做任何事情,它将需要第二个单元格。

概念验证:一个简单的 Jupyter 笔记本,world.ipynb,在目录 hello.

单元格 #1:

def get_notebook_name():
    """Execute JS code to save Jupyter notebook name to variable `notebook_name`"""
    from IPython.core.display import Javascript, display_javascript
    js = Javascript("""IPython.notebook.kernel.execute('notebook_name = "' + IPython.notebook.notebook_name + '"');""")
    return display_javascript(js)

def get_notebook_path():
    """Execute JS code to save Jupyter notebook path to variable `notebook_path`"""
    from IPython.core.display import Javascript, display_javascript
    js = Javascript("""IPython.notebook.kernel.execute('notebook_path = "' + IPython.notebook.notebook_path + '"');""")
    return display_javascript(js)

# execute javascript
get_notebook_name()
get_notebook_path()

单元格 #2

# print results
print(f"{notebook_name=}")
print(f"{notebook_path=}")

结果:

notebook_name='world.ipynb'
notebook_path='hello/world.ipynb'