为笔记本设置默认 sys.path

Setting a default sys.path for a Notebook

我所有的 .py 文件都在一个文件夹脚本中,我所有的 IPython-notebooks 都在一个名为 Notebook 的文件夹中。

每个笔记本文件对脚本上的一个或多个文件存在多个交叉依赖关系。

在每个笔记本上添加 sys.path.append 似乎很麻烦,我希望有一种方法可以添加默认查找路径,就像我们将 PYTHONPATH 添加到 .bash_profile 一样。

现在我执行以下操作:

import sys
sys.path.append("<path where DeriveFinalResultSet.py exists>)
import DeriveFinalResultSet as drs

我希望有一个可以执行以下操作的设置:

import DeriveFinalResultSet as drs

经过一些研究,我意识到在 .bash_profile 中更改 PYTHONPATH 应该可以解决问题。

这是我添加到 .bash_profile

中的两行
PYTHONPATH="<path where DeriveFinalResultSet.py exists>:$PYTHONPATH"
export PYTHONPATH

为了验证,我在打开新的 IPython Notebook 后执行了以下操作。

import sys
print(sys.path)
['', '**<path where DeriveFinalResultSet.py exists>**', '<some path>Google Drive/Project/AnimalPhotoBias/Notebooks', '<some path>anaconda/lib/python35.zip', '<some path>anaconda/lib/python3.5', '<some path>anaconda/lib/python3.5/plat-darwin', '<some path>anaconda/lib/python3.5/lib-dynload', '<some path>anaconda/lib/python3.5/site-packages/Sphinx-1.3.5-py3.5.egg', '<some path>anaconda/lib/python3.5/site-packages/setuptools-20.3-py3.5.egg', '<some path>anaconda/lib/python3.5/site-packages', '<some path>anaconda/lib/python3.5/site-packages/aeosa', '<some path>anaconda/lib/python3.5/site-packages/IPython/extensions', '<some path>.ipython']

为了避免 "hidden configurations"(即不在源 control/machine-specific 中的东西)并保持 notebook/code 像你描述的那样分离,我做了如下的事情:

code/
    mymodule.py
    mypackage/
        __init__.py

notebooks/
    mynb.ipynb
    mynb2.ipynb
    paths.py   <--- below

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')

然后在mynb*.ipynb我可以愉快地做:

import paths
import mymodule, mypackage

,等等

后一种形式有效地替换了从空字符串(当前目录)到 "code" 目录的导入路径,这可能更简洁一些。这使得导入对使用 os.chdir().

之类的东西不敏感

我编写了简单的 bash 脚本来更新路径并启动 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