我如何获得当前的IPython Notebook名称

我想在运行IPython笔记本时获取当前的NoteBook名称。 我知道我可以在笔记本顶部看到它。 我喜欢什么之后

currentNotebook = IPython.foo.bar.notebookname() 

我需要得到一个variables的名字。

正如已经提到过的,你可能不能够这样做,但是我确实find了一种方法。 这是一个燃烧的黑客虽然所以不要依靠这个:

 import json import os import urllib2 import IPython from IPython.lib import kernel connection_file_path = kernel.get_connection_file() connection_file = os.path.basename(connection_file_path) kernel_id = connection_file.split('-', 1)[1].split('.')[0] # Updated answer with semi-solutions for both IPython 2.x and IPython < 2.x if IPython.version_info[0] < 2: ## Not sure if it's even possible to get the port for the ## notebook app; so just using the default... notebooks = json.load(urllib2.urlopen('http://127.0.0.1:8888/notebooks')) for nb in notebooks: if nb['kernel_id'] == kernel_id: print nb['name'] break else: sessions = json.load(urllib2.urlopen('http://127.0.0.1:8888/api/sessions')) for sess in sessions: if sess['kernel']['id'] == kernel_id: print sess['notebook']['name'] break 

我更新了我的答案,包括一个解决scheme,在IPython 2.0中“起作用”,至less通过一个简单的testing。 如果有多个笔记本连接到相同的内核,可能不能保证给出正确的答案。

我有以下与IPython 2.0一起使用。 我观察到,笔记本的名字作为属性'data-notebook-name'的值存储在页面的<body>标签中。 因此,这个想法首先要求Javascript检索属性 – 由于%%javascript魔术,可以从代码单元调用%%javascript 。 然后可以通过调用Python内核来访问Javascriptvariables,并使用设置Pythonvariables的命令。 由于这个最后一个variables是从内核已知的,所以也可以在其他单元中访问它。

 %%javascript var kernel = IPython.notebook.kernel; var body = document.body, attribs = body.attributes; var command = "theNotebook = " + "'"+attribs['data-notebook-name'].value+"'"; kernel.execute(command); 

从一个Python代码单元

 print(theNotebook) 

出[]:HowToGetTheNameOfTheNoteBook.ipynb

在这个解决scheme中的一个缺陷是,当一个人改变笔记本的名称(名称)时,这个名字似乎不会立即更新(可能有某种caching),并且需要重新加载笔记本才能访问新名字。

[编辑]在反思中,更有效的解决scheme是查找笔记本名称的input字段而不是<body>标签。 看看源代码,看起来这个字段有id“notebook_name”。 然后可以通过document.getElementById()来获取这个值,然后按照上面的方法。 代码变成了,仍然使用javascript魔术

 %%javascript var kernel = IPython.notebook.kernel; var thename = window.document.getElementById("notebook_name").innerHTML; var command = "theNotebook = " + "'"+thename+"'"; kernel.execute(command); 

然后,从一个ipython的单元格,

 In [11]: print(theNotebook) Out [11]: HowToGetTheNameOfTheNoteBookSolBis 

与第一种解决scheme相反,笔记本名称的修改会立即更新,无需刷新笔记本电脑。

在Jupyter 3.0下面的作品。 在这里,我展示了Jupyter服务器上的整个path,而不仅仅是笔记本名称:

要在当前笔记本前端存储NOTEBOOK_FULL_PATH

 %%javascript var nb = IPython.notebook; var kernel = IPython.notebook.kernel; var command = "NOTEBOOK_FULL_PATH = '" + nb.base_url + nb.notebook_path + "'"; kernel.execute(command); 

然后显示它:

 print("NOTEBOOK_FULL_PATH:\n", NOTEBOOK_FULL_PATH) 

运行第一个Javascript单元格不会产生输出。 运行第二个Python单元格产生如下所示:

 NOTEBOOK_FULL_PATH: /user/zeph/GetNotebookName.ipynb 

增加以前的答案,

获取笔记本名称在单元格中运行以下内容:

 %%javascript var command = "nb_name = '" + IPython.notebook.notebook_path + "'; nb_name = nb_name.split('/')[-1]"; IPython.notebook.kernel.execute(command); 

这让你在nb_name中的文件名

那么得到完整的path,你可以在一个单独的单元格中使用以下内容:

 import os nb_full_path = os.path.join(os.getcwd(), nb_name)