运行 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 使用CV2库出现找不到模块问题
教你查看 jupyter notebook 每个单元格运行时间