2016-07-07 118 views
6

我将所有.py文件放在文件夹脚本中,并将所有IPython笔记本放在名为Notebook的文件夹下。为IPython Notebook设置默认sys.path

对于脚本上的一个或多个文件上的每个笔记本文件,存在多个交叉相关性。

在每个笔记本上面都有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

我不知道这里的答案,但也许你可以把它添加到自定义文件:https://ipython.org /ipython-doc/2/config/intro.html#setting-configurable-选项 – mgilson

+0

或者,您可以在给定脚本调用'ipython'之前创建一个带有PYTHONPATH集的简单bash脚本... – mgilson

+0

@mgilson:我已更新。 bash_profile,并指出PYTHONPATH指向我想要的目录。然后我从控制台启动'jupiter-notebook',它似乎在做诡计。我只是在下面发布答案。如果可以,你能证实它是否正确? –

回答

7

为了避免“隐性配置”(即东西不是在源代码管理/机专用),并保持笔记本/代码分离像你描述的,我像做以下:

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()之类的东西不敏感。

+0

很棒的回答。也许'pathlib.Path()。resolve()。parent'作为次要的改进? – aparkerlue

0

一些研究,我意识到在.bash_profile改变PYTHONPATH应该做的伎俩后。

这里是我加入到我的.bash_profile

PYTHONPATH="<path where DeriveFinalResultSet.py exists>:$PYTHONPATH" 
export PYTHONPATH 

为了验证两行,我做了一个开放的IPython新鲜手提电脑之后,以下。

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'] 
+1

这应该工作。您可以将它简化为1行:'export PYTHONPATH =“...:$ {PYTHONPATH}”' – mgilson

+0

@mgilson:感谢您的投票!美好的一天! –

+2

可能是'bash_profile' - 不是这种配置的最佳位置。如果你有两个或多个项目,这种方法会为'PYTHONPATH'增加太多的额外路径,并可能导致名称冲突。 – maxkoryukov

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