How do I import module in jupyter notebook directory into notebooks in lower directories?
Question:
I have used jupyter notebook for data analysis for quite sometime. I would like to develop a module in my jupyter notebook directory and be able to import that new module into notebooks. My jupyter notebook file directory can be represented as follows;
Jupyter notebooks
notebook1.ipynb
new_module
__init__.py
newfunction.py
currentnotebooks
notebook2.ipynb
When use import new_module
in notebook1.ipynb it works however when I try the same command in notebook2.ipynb I get the following ImportError: No module named 'new_module'
. The two obvious solutions are A) move new_module into the currentnotebooks directory or B) move notebook2.ipynb up to the same level as new_module. I don’t want to mess around with the file structure at all. Is this possible?
Answers:
You need to make sure that the parent directory of new_module
is on your python path. For a notebook that is one level below new_module
, this code will do the trick:
import os
import sys
nb_dir = os.path.split(os.getcwd())[0]
if nb_dir not in sys.path:
sys.path.append(nb_dir)
If you’re further down in the directory hierarchy, you will need to adjust the way nb_dir
is set, but that’s all. You should not run this code for a notebook in Jupyter notebooks
, since it would add the parent of that directory to the python path, which is probably undesirable.
The reason the import works for notebook1
is that sys.path contains ''
(the empty string), which is aways the current directory of the running interpreter (kernel, in this case). A google search for explain python path
turns up several good explanations of how python uses PYTHONPATH
(aka sys.path
).
I have used jupyter notebook for data analysis for quite sometime. I would like to develop a module in my jupyter notebook directory and be able to import that new module into notebooks. My jupyter notebook file directory can be represented as follows;
Jupyter notebooks
notebook1.ipynb
new_module
__init__.py
newfunction.py
currentnotebooks
notebook2.ipynb
When use import new_module
in notebook1.ipynb it works however when I try the same command in notebook2.ipynb I get the following ImportError: No module named 'new_module'
. The two obvious solutions are A) move new_module into the currentnotebooks directory or B) move notebook2.ipynb up to the same level as new_module. I don’t want to mess around with the file structure at all. Is this possible?
You need to make sure that the parent directory of new_module
is on your python path. For a notebook that is one level below new_module
, this code will do the trick:
import os
import sys
nb_dir = os.path.split(os.getcwd())[0]
if nb_dir not in sys.path:
sys.path.append(nb_dir)
If you’re further down in the directory hierarchy, you will need to adjust the way nb_dir
is set, but that’s all. You should not run this code for a notebook in Jupyter notebooks
, since it would add the parent of that directory to the python path, which is probably undesirable.
The reason the import works for notebook1
is that sys.path contains ''
(the empty string), which is aways the current directory of the running interpreter (kernel, in this case). A google search for explain python path
turns up several good explanations of how python uses PYTHONPATH
(aka sys.path
).