如何获取 Jupyter Notebook 的路径?

loc*_*oop 24 python jupyter jupyter-notebook

是否有获取笔记本路径的功能?

我在谷歌上搜索了一些关于这个主题但没有找到一个简单的方法来做到这一点......我想获得笔记本的路径,以便我可以在其他地方使用它。这样我就可以在与笔记本相同的路径中保存/使用文件,而不必担心它被保存在哪里。

现在我的解决方案是将以下代码放在最上面,但显然这至少会带来必须手动执行单元格的问题,而且如果工作目录发生更改,这将停止工作。

import os
current_path = os.getcwd()
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 20

TLDR:你不能

不可能始终如一地获得 Jupyter 笔记本的路径。有关更多信息,请参阅ipython 问题 #10123。我会引用Carreau 的话

以下是内核(在本例中为 IPython)的一些原因:

  • 可能不是从单个文件运行
  • 即使是一个文件,该文件也可能不是笔记本。
  • 即使是笔记本,笔记本也可能不在文件系统上。
  • 即使在一个文件系统上,它也可能不在同一台机器上。
  • 即使在同一台机器上,文件的路径在 IPython 上下文中也可能没有意义。
  • 即使它有道理,Jupyter 协议也没有被设计成这样做。我们没有计划在短期或长期内改变这种抽象。

您的 hack 在大多数情况下都有效,并且根据情况还不错。

  • 我觉得在 99.9999% 的情况下,只需提供一种返回 `.ipynb` 位置的方法就足够了。这感觉与现实世界的使用有令人惊讶的脱节,并且是非Python式的思维。 (37认同)
  • 我认为你大大低估了这种情况发生的频率。Google Colab 使用非常广泛,在那里不可能给出 ipynb 的位置。 (2认同)
  • 我不使用colab,也不关心它。 (2认同)

Bra*_*ens 12

更新:

我找到了这个解决问题的答案。以下命令返回 *.py 和 *.ipynb 文件的文件夹路径。

import os
os.path.abspath("")
Run Code Online (Sandbox Code Playgroud)

我做了一些工作来解决这个问题,但我发现这对于非笔记本项目也通常很有帮助。在笔记本所在的同一文件夹中创建一个名为“base_fns.py”的文件。在此文件中放置以下代码:

import os

def get_local_folder():
    return os.path.dirname(os.path.realpath(__file__))
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令获取包含 base_fns 的文件夹的路径:

from base_fns import get_local_folder()
rt_fldr = get_local_folder()
print(rt_fldr)
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  1. 这为您提供了包含“base_fns.py”的文件夹的绝对路径,而不是您的笔记本。如果您的笔记本和base_fns位于同一文件夹中,则您的笔记本和base_fns的文件夹的绝对路径将相同。
  2. 如果将 base_fns 放在不同的文件夹中,您将需要知道从 base_fns 文件夹导航到笔记本文件夹的相对路径。
  3. 如果您正在处理具有文件夹结构的较大项目,则可以将 base_fns.py 放置在已知文件夹中,然后导航以查找您可能需要的任何其他文件夹/文件。

  • 这在 jupyter 笔记本中不起作用:`NameError on __file__` (6认同)
  • 这仅适用于 .py 文件,不适用于 jupyter 笔记本(ipynb 扩展名) (4认同)

sal*_*hin 6

在 VSCode Jupyter 中,您可以在单元格中尝试此操作:

import IPython
notebook_name = "/".join(
        IPython.extract_module_locals()[1]["__vsc_ipynb_file__"].split("/")[-5:]
    )
print(notebook_name)
Run Code Online (Sandbox Code Playgroud)