我如何获得当前的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)