如何在IPython 3.x / Jupyter Notebook中访问配置?

6

特别是我想知道代码运行的笔记本服务器的base_url

在IPython Notebooks 2.x版本中,我曾经这样做:

config = get_ipython().config
print config['NotebookApp']['base_url']

然而,在IPython Notebook 3.x / Jupyter Notebooks中,这种方法不再适用。
编辑:我想进一步说明我的目标。我在同一主机上的不同Docker容器中运行各种IPython服务器,通过不同的base_url访问它们。我想使用quantopian/qgrid包在Notebook中显示Pandas数据帧。最初,qgrid无法处理自定义base_url前缀以提供本地Javascript依赖项的服务,但上面的代码允许我在IPython 2中找到base_url,并将相关的base_url注入Javascript模板。
我也想在Notebook中使用mpld3库,在查看他们的文档时,我发现他们还提到了这点"IPython 2.0+,如果添加url前缀(例如通过设置NotebookApp.base_url),local=True可能会失败。",所以这似乎不是一个孤立的问题,找到一个好的解决方案很值得一试。
根据@matt下面的评论和更多关于内核与前端的分离的思考,NotebookApp配置无法从内核访问是有道理的。实际上,生成的JS代码需要知道base_url信息,因此,如果有人能指出我在Notebook JS API中可以访问它的位置,那么这个问题就可以解决。

你为什么需要 base_url?你想要实现什么目标,然后我们可以讨论在哪里获取它。这取决于你是做JS扩展、服务器扩展还是内核扩展。 - Matt
@Matt 谢谢你的评论。我已经在问题中添加了更多细节。这确实需要在JS扩展中完成。我没有仔细考虑过,一直试图在内核中使用Python解决它,因为我更熟悉Python。 - snth
已添加答案,尚未仔细查看mpld3和qgrid的操作方式,但希望这能有所帮助。欢迎反馈是否有遗漏之处。 - Matt
2个回答

3

从前端角度来看,如果你发布JavaScript,并且假设你在笔记本电脑上(请记住,在JS中并不一定意味着笔记本电脑,你可能是Atom-Hydrogen或Jupyter-Sidecar),您可以使用以下代码片段:

require(['base/js/utils'], function(utils){
    var base_url = utils.get_body_data('base-url')
})

data-base-url属性设置在笔记本的<body>标签上。

但不能保证一直保持这种方式。通常,扩展应该安装在nbextensions文件夹中,这样应该会自动正确解析:

require.config({

      ...
      paths: {
        nbextensions : '<base url>/nbextensions',
        kernelspecs : '<base url>/kernelspecs',
...
})

Nbextension是搜索路径,因此如果在服务器上设置正确,您通常不需要自己在自定义URL上提供服务,也不需要在前端处理base_url


-1

在深入研究IPython内部后,我找到了适合我的解决方案:

from IPython.config.loader import load_pyconfig_files
config = get_ipython().config
profiledir = config['ProfileDir']['location']
nbconfig = load_pyconfig_files(['ipython_notebook_config.py'], profiledir)
print nbconfig['NotebookApp']['base_url']

编辑:这在我的安装上有效,但我现在明白内核不是获取此信息的正确位置。一旦有更好的答案,我可能会删除此答案。


准备好在第4版本中出现错误。按照设计,运行代码的内核并不知道笔记本服务器的存在。 - Thomas K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接