2016-07-07 296 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