首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取当前的IPython / Jupyter笔记本名称

如何获取当前的IPython / Jupyter笔记本名称
EN

Stack Overflow用户
提问于 2012-09-22 21:10:00
回答 7查看 56.2K关注 0票数 98

在运行IPython笔记本时,我正在尝试获取当前的notebook名称。我知道我可以在笔记本的顶部看到它。我想要的是什么

代码语言:javascript
复制
currentNotebook = IPython.foo.bar.notebookname()

我需要在一个变量中获取名称。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-10-25 02:35:29

正如已经提到的,你可能真的不能做到这一点,但我确实找到了一种方法。不过,这是一个火热的黑客攻击,所以根本不要依赖它:

代码语言:javascript
复制
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中“工作”的解决方案。如果有多个笔记本连接到同一个内核,可能不能保证给出正确的答案,等等。

票数 28
EN

Stack Overflow用户

发布于 2018-09-05 22:16:19

看起来我不能评论,所以我不得不把这个作为一个答案。

@iguananaut接受的解决方案和@mbdevpl的更新似乎不适用于最新版本的Notebook。我修复了它,如下所示。我在PythonV3.6.1+ Notebook v5.0.0以及PythonV3.6.5和Notebook v5.5.0上进行了检查。

代码语言:javascript
复制
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“时似乎不起作用(但在”手动“执行单元时起作用),这对我来说是一个破坏交易的因素。

票数 28
EN

Stack Overflow用户

发布于 2020-03-19 20:10:37

ipyparams包可以很容易地做到这一点。

代码语言:javascript
复制
import ipyparams
currentNotebook = ipyparams.notebook_name
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12544056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档