【问题标题】:Get Base URL of Current Jupyter Server IPython is Connected To获取当前 Jupyter 服务器 IPython 连接到的基本 URL
【发布时间】:2021-04-05 02:55:35
【问题描述】:

我希望能够知道 IPython 目前连接到的 Jupyter Notebook 服务器的基本 URL。我知道notebook.notebookapp.list_running_servers() 函数会产生如下输出:

[
  {
    'base_url': '/',
    'hostname': 'localhost',
    'notebook_dir': '/home/username/dir-notebook-was-spawned-in',
    'password': False,
    'pid': 368094,
    'port': 8888,
    'secure': False,
    'sock': '',
    'token': '4e7e860527d5333306cb06c594aa2167a7d375294f96c2d9',
    'url': 'http://localhost:8888/',
  },
  ...
]

这感觉非常接近我想要的,因为那里有一个base_url 键,但是我不知道如何确定列表中的哪个服务器是 IPython 实际连接的位置。我能想出的最接近的近似值是查看哪个服务器的notebook_dir 键与os.getcwd() 最接近,但这显然是不完美的。

进一步的发现

  • 我现在意识到notebook.notebookapp.list_running_servers() 不是解决此问题的正确方法,因为不能保证笔记本服务器和内核在同一个地方运行,在这种情况下,该函数将始终返回一个空列表.

【问题讨论】:

    标签: jupyter-notebook ipython jupyter jupyterhub


    【解决方案1】:

    ipyleaflet 对此进行了一些讨论。您不能仅从后端获取基本 URL,我们在 ipyleaflet 中执行此操作的方式是使用window.location.href 获取它in the front-end

    【讨论】:

    • 所以我想接下来的问题是如何在 Javascript 端获取基本 URL。
    • window.location.href 返回 URL。
    • 这并没有给你笔记本服务器的基本 URL。例如,在 Binder(或可能的任何其他 JupyterHub deployemt)中,服务器不会暴露在/,而是在根目录下的某个可能不确定的路径上。在编写 Jupyter 服务器扩展时,了解基本 URL 很重要,这样您的客户端就可以访问扩展的资源。
    • 你是对的,例如在 xarray-leaflet 中我们尝试infer the base URL from the browser's URL,但它不是很好。在 Binder 的情况下,它会在 URL 中添加一个随机路径并重定向到服务器的基本 URL,因此您需要这个随机部分。也许将浏览器的 URL 与 notebook.notebookapp.list_running_servers() 的基本 URL 结合使用是最好的?
    • 我发布了ipyurl,如果前端是 JupyterLab,它允许获取 Jupyter 服务器的基本 URL。
    【解决方案2】:

    在命令行上,您可以使用以下内容:

    jupyter notebook list --json | python3 -c 'import json; import sys; print(json.load(sys.stdin)["base_url"])'
    

    (从该命令中删除 ["base_url"] 部分以查看完整的字典)。

    在 Python 中,base url 列在以下输出中:

    import psutil
    psutil.Process().parent().cmdline()
    

    这些来自 Jupyter Discourse 论坛 herehere 上的讨论。

    对于 Binder 会话,有人指出 here 使用以下内容来获得详细的详细列表:

    env | grep -i jupyter
    

    【讨论】:

    • 正如在对原始问题的编辑中指出的那样,任何服务器端都无法正常工作,因为不能保证内核和实际的笔记本服务器在同一实例上运行。因此,检查 jupyter notebook list 之类的东西(在后台使用 list_running_servers())不会在所有情况下都有效,并且可能会产生一个空列表。查找服务器的基本 URL 必须在客户端完成。
    • 对不起,我想也许这给了你扩展所需的部分,因为window.location.href 似乎不是你需要的。鉴于您帖子标题中的关键词,这两个建议可能会对以后的人有所帮助。
    • 是的。在不同的情况下绝对是一个可能的解决方案。 psutil 的用法是我还没有遇到过的,所以这可能对其他人有用。但在我的特殊情况下,还不够笼统。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多