2012-04-10 89 views
73

編輯:根據Ulf Rompe的評論,重要的是你使用「1」而不是「0」,否則你會打破sys.path爲什麼使用sys.path.append(path)而不是sys.path.insert(1,path)?

我一直在做蟒蛇相當長一段時間(一年以上),我總是困惑,爲什麼人們建議你使用sys.path.append()而不是sys.path.insert()。讓我來證明一下。

假設我正在研究一個名爲PyWorkbooks(安裝在我的計算機上)的模塊,但我正在同時使用合併PyWorkbooks的不同模塊(比方說PyJob)。當我在PyJob上工作時,我在PyWorkbooks中發現了我正在糾正的錯誤,所以我想導入一個開發版本。

有兩種工作方式(例如,我可以將PyWorkbooks項目放在PyJob中),但有時我仍然需要使用路徑。然而,我不能簡單地做一個sys.path.append()到PyWorkbooks在的文件夾。爲什麼?因爲python會先找到我安裝的PyWorkbooks!

這就是爲什麼你必須做一個sys.path.insert(1 path_to_dev_pyworkbooks)

總結:

sys.path.append(path_to_dev_pyworkbooks) 
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one 

或:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0** 
import PyWorkbooks # imports correct file 

這造成了幾對我來說,在過去,我真的很喜歡它,如果我們(作爲一個社區)開始推薦sys.path.insert(1, path),就好像你正在手動插入一條路徑一樣,我認爲可以肯定地說這就是路徑你想用!

還是我有什麼問題?這是一個有時困擾我的問題,我希望它公開!

+1

我已經完成了ys.path.insert(1,dev_folder)'但它仍然沒有找到開發模塊,只使用已安裝的模塊。我該如何解決? – endolith 2014-06-14 15:28:59

回答

40

如果你有一個包/模塊的多個版本,你需要使用virtualenv(重點煤礦):

virtualenv是創建孤立的Python環境的工具。

正在解決的基本問題是依賴和版本以及間接權限之一。 想象一下你有一個需要LibFoo版本1的應用程序,但是另一個應用程序需要版本2.你怎麼能使用這兩個應用程序?如果您將所有內容都安裝到/usr/lib/python2.7/site-packages(或任何平臺的標準位置),則很容易導致無意中升級不應升級的應用程序。

或者更一般地說,如果你想安裝一個應用程序,並且假設它是?如果應用程序有效,其庫中的任何更改或這些庫的版本都可能會中斷應用程序。

另外,如果無法將軟件包安裝到全局site-packages目錄中,該怎麼辦?例如,在共享主機上。

在所有這些情況下,virtualenv都可以幫到你。它會創建一個具有自己的安裝目錄的環境,它不會與其他虛擬環境共享庫(也可能不訪問全局安裝的庫)。

這就是爲什麼人們認爲insert(0,是錯的 - 這是管理多個環境問題的一個不完整的解決方案。

+0

謝謝,我隱約知道這樣的東西存在,但我到現在還沒有實際檢查過它。 所以我要做的就是在虛擬環境中運行所有的解釋器......這也可以起作用。謝謝! – 2012-04-10 19:33:13

37

如果你確實需要使用sys.path.insert,考慮離開的sys.path [0],因爲它是:

sys.path.insert(1, path_to_dev_pyworkbooks) 

這可能是重要的,因爲第三方代碼可能依賴於sys.path documentation一致性:

如在程序啓動時,該列表的第一項, 路徑[0],是含有用來 調用Python解釋腳本的目錄初始化。

12

你混淆了追加和預先考慮的概念。下面的代碼前面加上:

sys.path.insert(1,'/thePathToYourFolder/') 

它放置在開始(當然,第二,要準確),你的解釋會通過搜索序列的新信息。 sys.path.append()將事物放在搜索序列的最後。

建議您使用類似virtualenv的東西,而不是每次手動將包目錄手動編碼到PYTHONPATH。設立該單獨的站點包和Python的可能版本不同的生態系統,閱讀這兩個博客:

  1. python ecosystems introduction

  2. bootstrapping python virtual environments

,如果你決定要向下移動環境隔離的途徑你肯定會從virtualenvwrapper中獲益:http://www.doughellmann.com/docs/virtualenvwrapper/

相關問題