Setting a default sys.path for a Notebook
To avoid "hidden configurations" (i.e. things that aren't in source control/machine-specific) and to maintain a notebook/code separation like you describe, I do something like the below:
code/
mymodule.py
mypackage/
__init__.py
notebooks/
mynb.ipynb
mynb2.ipynb
paths.py <--- below
In paths.py
:
import sys
import pathlib
sys.path.insert(0, str(pathlib.Path(__file__).parents[1] / 'code'))
# sys.path[0] = str(pathlib.Path(__file__).parents[1] / 'code')
Then in mynb*.ipynb
I can happily do:
import paths
import mymodule, mypackage
, etc.
The latter form effectively replaces the import path from the empty-string (current directory) to the "code" directory, which is perhaps a bit cleaner. This makes imports insensitive to using stuff like os.chdir()
.
I wrote simple bash script which updates the path and launches Jupyter:
#!/usr/bin/env bash
echo "Saving PYTHONPATH"
ORIGINAL_PYTHONPATH=$PYTHONPATH
echo "Prepending package to PYTHONPATH"
export PYTHONPATH="$PWD/:$ORIGINAL_PYTHONPATH"
echo "Starting Jupyter"
jupyter notebook
echo "Reverting to the original PYTHONPATH"
export PYTHONPATH=$ORIGINAL_PYTHONPATH