在运行IPython笔记本时,我正在尝试获取当前的notebook名称。我知道我可以在笔记本的顶部看到它。我想要的是什么
currentNotebook = IPython.foo.bar.notebookname()
我需要在一个变量中获取名称。
发布于 2012-10-25 02:35:29
正如已经提到的,你可能真的不能做到这一点,但我确实找到了一种方法。不过,这是一个火热的黑客攻击,所以根本不要依赖它:
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
我更新了我的答案,包括了一个至少通过一个简单的测试就能在IPython 2.0中“工作”的解决方案。如果有多个笔记本连接到同一个内核,可能不能保证给出正确的答案,等等。
发布于 2018-09-05 22:16:19
看起来我不能评论,所以我不得不把这个作为一个答案。
@iguananaut接受的解决方案和@mbdevpl的更新似乎不适用于最新版本的Notebook。我修复了它,如下所示。我在PythonV3.6.1+ Notebook v5.0.0以及PythonV3.6.5和Notebook v5.5.0上进行了检查。
import jupyterlab
if jupyterlab.__version__.split(".")[0] == "3":
from jupyter_server import serverapp as app
key_srv_directory = 'root_dir'
else :
from notebook import notebookapp as app
key_srv_directory = 'notebook_dir'
import urllib
import json
import os
import ipykernel
def notebook_path(key_srv_directory, ):
"""Returns the absolute path of the Notebook or None if it cannot be determined
NOTE: works only when the security is token-based or there is also no password
"""
connection_file = os.path.basename(ipykernel.get_connection_file())
kernel_id = connection_file.split('-', 1)[1].split('.')[0]
for srv in app.list_running_servers():
try:
if srv['token']=='' and not srv['password']: # No token and no password, ahem...
req = urllib.request.urlopen(srv['url']+'api/sessions')
else:
req = urllib.request.urlopen(srv['url']+'api/sessions?token='+srv['token'])
sessions = json.load(req)
for sess in sessions:
if sess['kernel']['id'] == kernel_id:
return os.path.join(srv[key_srv_directory],sess['notebook']['path'])
except:
pass # There may be stale entries in the runtime directory
return None
正如文档字符串中所述,只有在没有身份验证或身份验证是基于令牌的情况下,这才有效。
请注意,正如其他人所报告的,基于Javascript的方法在执行"Run all cells“时似乎不起作用(但在”手动“执行单元时起作用),这对我来说是一个破坏交易的因素。
发布于 2020-03-19 20:10:37
ipyparams包可以很容易地做到这一点。
import ipyparams
currentNotebook = ipyparams.notebook_name
https://stackoverflow.com/questions/12544056
复制相似问题