我将所有.py文件放在文件夹脚本中,将所有IPython笔记本放在名为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
答案 0 :(得分:8)
为了避免“隐藏配置”(即不在源代码控制/特定于机器中的东西)并保持笔记本/代码分离(如您所述),我执行以下操作:
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
等。
后一种形式有效地替换了从空字符串(当前目录)到“代码”目录的导入路径,这可能更清晰一些。这使得导入对使用os.chdir()
等内容不敏感。
答案 1 :(得分:2)
我编写了简单的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
答案 2 :(得分:0)
经过一些研究后,我意识到在PYTHONPATH
中改变.bash_profile
应该可以解决问题。
以下是我添加到.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']