为笔记本设置默认 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
我所有的 .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