How do I import module in jupyter notebook directory into notebooks in lower directories?
我已经使用jupyter笔记本进行数据分析了很长一段时间。 我想在我的jupyter notebook目录中开发一个模块,并能够将新模块导入到笔记本中。 我的jupyter笔记本文件目录可以表示如下;
1 2 3 4 5 6 7 8 9 10
| Jupyter notebooks\
notebook1.ipynb
new_module\
__init__.py
newfunction.py
currentnotebooks\
notebook2.ipynb |
当在notebook1.ipynb中使用import new_module时,它可以正常工作,当我在notebook2.ipynb中尝试相同的命令时,我得到以下ImportError: No module named 'new_module'。 两个明显的解决方案是A)将new_module移动到currentnotebooks目录或B)将notebook2.ipynb移动到与new_module相同的级别。 我根本不想乱用文件结构。 这可能吗?
-
如果将new_module放入sys.path中列出的某个目录中,则可以从任何位置导入。
您需要确保new_module的父目录位于您的python路径上。 对于低于new_module一级的笔记本,此代码将起到作用:
1 2 3 4 5
| import os
import sys
nb_dir = os.path.split(os.getcwd())[0]
if nb_dir not in sys.path:
sys.path.append(nb_dir) |
如果您在目录层次结构中更进一步,则需要调整nb_dir的设置方式,但这就是全部。 您不应该在Jupyter notebooks中为笔记本运行此代码,因为它会将该目录的父代添加到python路径,这可能是不合需要的。
导入适用于notebook1的原因是sys.path包含''(空字符串),它远离正在运行的解释器的当前目录(在本例中为内核)。 谷歌搜索explain python path对python如何使用PYTHONPATH(又名sys.path)提出了几个很好的解释。
-
所以我总是必须先做你建议的样板代码才能访问其他模块,即使它们只是上面的一个文件夹? 没有其他正确的方法来实现这一目标,例如 通过相对进口? (虽然我必须承认我仍然不确定相对进口是如何运作的)
-
或多或少。 例外情况是父目录也是一个模块(因此有一个__init__.py文件),但这似乎既奇怪又不太可能。 将笔记本目录放在PYTHONPATH中可以避免以这种方式将其添加到sys.path中。