运行 jupyter notebook 时从存储库的根目录导入

我有一个具有以下设置的存储库:


│
└───foo_lib
│   │   bar.py
│   
└───notebooks
    │   my_notebook.ipynb

所以基本上我在 foo_lib 中有一些通用的 Python 代码,在 notebooks 中有一些笔记本

my_notebook 中,我想使用 foo_lib 中的代码。所以我这样做:

from foo_lib import bar

但这不起作用,因为当笔记本执行时,repo 的根不在我的 python 路径中。

---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-e2c421feccf4> in <module>
----> 1 from foo_lib import bar
ModuleNotFoundError: No module named 'foo_lib'

我一直在使用的技巧是将 %cd .. 放在第一个单元格中。然后工作目录是 repo 的根目录,我可以正常导入。但它不是幂等的,所以如果我多次运行单元格,导入会再次中断。

我找到了一个幂等的解决方案。在 jupyter 中运行时,我可以使用 globals()["_dh"][0] 指向包含笔记本的目录:

import os
os.chdir(os.path.join(globals()["_dh"][0],".."))

不幸的是,当我使用 nbconvert 以编程方式运行笔记本时,这不起作用:

import json

import nbconvert
import nbformat


def run_notebook():
    ep = nbconvert.preprocessors.ExecutePreprocessor()
    with open("notebooks/my_notebook.ipynb") as fp:
        nb = nbformat.read(fp,as_version=4)
    nb,resources = ep.preprocess(nb)
    print(json.dumps(nb,indent=2))


if __name__ == "__main__":
    run_notebook()

当我从存储库的根目录运行此脚本时,globals()["_dh"][0] 指向存储库的根目录

所以我正在寻找解决这个导入问题的方法:

  • 是幂等的
  • 在从浏览器/jupyter 执行时有效
  • 在使用 nbconvert 执行时有效
  • 很短:我必须将代码复制粘贴到每个笔记本中(因为在该代码运行之前,我无法进行导入)。

有没有更好的方法来做到这一点?

mounbo 回答:运行 jupyter notebook 时从存储库的根目录导入

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/535818.html

大家都在问