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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...