2016-01-21 52 views
2

我繼承了相當多的Python代碼和遍佈它下面的代碼片段它增加了父目錄到系統路徑的文件路徑。不斷添加路徑sys.path中

from os.path import join, dirname 
sys.path.insert(0, join(dirname(sys.argv[0]), "..\\")) 
from utilities import find, execute 

我對此的理解是它爲搜索路徑添加了一條路徑。在程序運行過程中,搜索路徑會增加許多路徑,並可能會使其變慢。隨着每個文件添加它自己的父目錄。

我喜歡的語法

from scm_tools.general.utilities import find, execute 

,因爲這是容易理解和少得多的代碼。這可能會影響我是否移動代碼,但它都在一個包中。

我是正確的假設,一個包,後者語法是做事情的更Python的方式裏面?

或者它沒有引擎蓋下蟒真正重要的是做一些魔術?

+0

你的兩個例子並不equivelent ...與Python 2.7引入了它相對於進口...我認爲你會做類似於'fromutilities import find,execute'這樣的東西......但是一般來說,從你的程序中編輯路徑是一種糟糕的形式(然而每個規則都有例外) –

+1

這是一個糟糕的模式。如果你提到的代碼都在同一個包中('scm_tools'?),那麼你的首選語法就好多了。 – MattDMo

+0

或者只是使用您的實際系統ENVIRNOMENT將路徑或pythonpath設置爲期望值(或者通常是您的IDE) –

回答

1

使用相對進口時,你可以:

from ..utilities import find, execute

這需要你留在模塊空間,這意味着每次遍歷目錄需要__init__.py文件中。

存在這樣的情況,如果你的測試目錄不是模塊結構這裏面發生故障,例如。在這些情況下,您需要編輯路徑,但不應像上例那樣盲目編輯路徑。

要麼添加到PYTHONPATH環境變量,你的代碼開始之前,讓您可以隨時參考目錄的根目錄或僅添加已經不在sys.path路徑,並嘗試避免添加任何東西,但模塊的根源。

PYTHONPATH變化是你希望分發代碼有點冒險。在您無法控制的PYTHONPATH中進行更改很容易,或者您無法以轉移到分佈式代碼的方式定義該添加。它還增加了一個令人討厭的模塊需求,其他人不得不處理 - 因此請保留這一點,以便添加要包含的整個模塊,如自定義站點包目錄。它的差不多總是更好地使用virtualenv這種情況。

如果你確實需要更改一個sys.path的內部代碼,你應該儘量至少避免在整個地方肆意破壞它,否則當它出現錯誤時你會很難解決它。爲了避免這種情況,只嘗試添加根模塊路徑,以便始終可以導入root.submodule.desiredmodule模式。此外,在將其插入sys.path之前,請檢查路徑是否已經存在,以避免非常長的sys.path s。在我的測試目錄,我常常有固定sys.path的目錄結構我測試的根目錄下有導入的文件:

# Add parent import capabilities 
parentdir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) 
if parentdir not in sys.path: 
    sys.path.insert(0, parentdir)