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

Posted

技术标签:

【中文标题】运行 jupyter notebook 时从存储库的根目录导入【英文标题】:Import from the root of the repository when running a jupyter notebook 【发布时间】:2021-07-16 22:20:10 【问题描述】:

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


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

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

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

from foo_lib import bar

但这不起作用,因为在执行 notebook 时,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 执行时有效 很短:我必须将代码复制粘贴到每个笔记本中(因为在该代码运行之前,我无法进行导入)。

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

【问题讨论】:

【参考方案1】:

我已经弄清楚本地存储库代码并通过调用添加到站点包中:

pip install -e .

【讨论】:

以上是关于运行 jupyter notebook 时从存储库的根目录导入的主要内容,如果未能解决你的问题,请参考以下文章

jupyter notebook怎么加环境变量

jupyter notebook 使用CV2库出现找不到模块问题

教你查看 jupyter notebook 每个单元格运行时间

教你查看 jupyter notebook 每个单元格运行时间

为 jupyter notebook 安装库

使 Jupyter notebook 以 html 格式执行