2013-07-22 91 views
3

knoware一個tonhow-to進口Python modules不是路徑,但我還沒有遇到過使用Python的__init.py__ VS sys.path.insert。哪種方法更好?是否有任何明顯的缺點,如表現?還有一個「Pythonic?」嗎?Python的__init__.py VS sys.path.append /插入

我可以想到的一個場景是我有一個程序,用戶下載並放在任何目錄中,所以我不知道絕對路徑(除非我以編程方式獲得它)。該文件夾的結構是

working dir 
    __init__.py 
    foo.py 
    src/ 
     my_utils.py 
     __init__.py 

我沒有看到使用__init__.py或更改sys.path之間的任何區別。有什麼情況可以想到它會在哪裏產生變化?

我的問題的第2部分是,爲什麼你必須做什麼能夠從子目錄導入模塊?我對Python相當陌生,所以也許我不明白爲什麼擺弄路徑或創建文件是樣板文件。對我而言,這似乎是一種不必要的複雜情況。如果我在當前工作目錄中有「dir」,並說「import dir.my_utils」,我不明白爲什麼我必須列出所有我希望能夠在__init__.py中導入的內容。

道歉,如果這是重複的,但我在發佈之前做過搜索。

編輯:這裏的另一個有用的鏈接:Automatically call common initialization code without creating __init__.py file

+1

「__init.py__' vs'sys.path.insert'」是什麼意思?這些東西在哪些方面可比? –

+0

因此,我可以將\ __ init__.py放在每個文件夾中,所以在foo.py中,我可以說「init src.my_utils」。或者,在foo.py中,我可以說「import sys; sys.path.insert(1,」src「的路徑); import my_utils」 – liang

+1

這些仍然完全不同。 –

回答

3

_ 初始化 _.py使用Python解釋治療目錄作爲包。包在避免命名空間衝突方面發揮着重要作用。如果您閱讀部分6.4包Python Modules,它有助於防止具有通用名稱的目錄隱藏稍後在搜索路徑中發生的其他有效模塊。

因此,軟件包機制簡化了導入軟件包的任務。通過使用init .py,您也可以執行類似於package.subpackage import *的操作,如果我們要繼續追加到sys.path(事實上,我們將不得不追加所有可能的模塊),那麼這將會很困難或繁瑣。

至於回答第二個部分,你的問題 - 爲什麼我們需要做什麼治療目錄作爲包 - 好,需要有某種方式告訴蟒蛇什麼應該被允許進口,什麼不應該是。另外,如果您已經在開始時導入了所有必需的模塊,並且您需要導入的模塊已經存在於PYTHONPATH環境變量中,則不需要將任何內容附加到sys.path中。

希望這個答案對你的查詢有一些啓發。

+0

謝謝,這確實有很大的幫助。我得到關於命名空間衝突的全部內容,但是指出'package.subpackage import *'作爲例子真正爲我闡明瞭它。 – liang

+0

我一直在尋找這個解決方案很長一段時間,但不知道我甚至在尋找什麼。我討厭我的一些程序目錄有很多模塊的混亂。這可以幫助我組織和清理它,只需在每個目錄中添加一個__init __。py。精彩! – jtsmith1287