2013-10-06 13 views
14

我知道的virtualenv,創建一個新的虛擬環境時,如果沒有通過--no-site-packages說法,將在/usr/local/lib/python2.7/site-packages與新創建的虛擬環境中鏈接包(對於Python 2.7)。在Ubuntu 12.04 LTS,我在那裏的Python 2.7軟件包可以安裝三個位置(使用默認的,Ubuntu提供的Python 2.7版安裝):如何讓virtualenv在Ubuntu上使用dist-packages?

  1. /usr/lib/python2.7/dist-packages:這有我的IPython中,SciPy的,numpy的,matplotlib的全局安裝 - 如果不能通過scipy stack獲得,我會發現單個安裝(以及所有依賴)時會遇到困難和耗時的軟件包。
  2. /usr/local/lib/python2.7/site-packages:這是空的,我認爲它會保持這種方式在Ubuntu上,除非我從源代碼安裝包。
  3. /usr/local/lib/python2.7/dist-packages:這對天文,特別是那些與PyRAF,STScI的等非常重要的地方軟件包,它們是非常困難和耗費時間的單獨安裝。

請注意,我的系統上不存在全局目錄,例如/usr/lib/python2.7/site-packages。還要注意,我的ipython,scipy等的全局安裝允許我使用那些包即時的,而無需每次都來源/激活虛擬環境。

當然,我現在想用的virtualenv建立在我的用戶主目錄中的一個虛擬的環境,我將輸出/激活我的未來的項目。不過,我希望這個虛擬環境在創建時可以鏈接/複製上面列表中位置(1)和(3)中的所有包。主要原因是我不想通過pip install進程(如果甚至可能的話)爲這個(也許是其他的)虛擬環境重新安裝ipython,scipy,astro-packages等。

這裏是我的問題:

  1. 有沒有辦法爲我指定VIRTUALENV,我想它在這兩個dist-packages目錄爲虛擬環境是在未來創建的鏈接/複製的包?
  2. 當我最終更新我SciPy的,IPython中,等兩個dist-packages目錄的全局安裝,這將同時更新/更改我的虛擬環境使用(和它最初的virtualenv創建過程中得到)的包?
  3. 如果我從源代碼安裝在Ubuntu軟件包,將它在/usr/local/lib/python2.7/dist-packages,或/usr/local/lib/python2.7/site-packages去?

預先感謝您的幫助!

回答

14

這可能是一個合法使用PYTHONPATH - 環境變量virtualenv不接觸,它使用相同的語法環境變量PATH,在bash PYTHONPATH=/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages在.bashrc或者類似。如果你遵循這條路線,

  1. 你根本不必告訴你的虛擬環境,它不會試圖改變它。

  2. 沒有重新鏈接將被要求,並

  3. 這仍然會去的地方它會去(pip install始終使用/usr/local/lib/python2.7/dist-packages/對我的Ubuntu),如果你將它們安裝在虛擬環境之外。如果你從你的虛擬環境中安裝它們(當它被激活時),那麼它當然會被置於虛擬環境中。

+3

這很好,謝謝!另一種方法是創建一個[.pth](http://docs.python.org/2/install/index.html#modifying-python-s-search-path)文件,其中每行是要添加的路徑到默認的sys.path,並將該文件放置在虛擬環境的site-packages目錄中,例如'/ home/userX/envY/lib/python2.7/site-packages'中的dist-packages.pth。現在我選擇了後一種方法,因爲它更明確地說明了爲什麼這個特定的虛擬環境可以訪問全局dist-packages目錄,而不是使用.bashrc中的「global」'PYTHONPATH'環境變量。 – quantumflash

+2

啊,那也不錯。有時我會在虛擬環境中的激活腳本中添加內容,並且可以在其中設置和取消設置PYTHONPATH,但由於.pth文件的工作原理可能更好。這是其他類似事情的好地方。 – Thomas

+0

這很好。直到我按照這個答案規定的方式設置PYTHONPATH時,我無法從virtualenv中安裝numpy。 – Will

4

PYTHONPATH適合我。

vim ~/.bashrc 

添加下面這行:

export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages 
source ~/.bashrc 
+0

如果/usr/lib/python2.7/dist-packages屬於root且您使用的是非root系統帳戶,該怎麼辦? – siliconsmiley

0

你想在這裏取得什麼實質上是添加特定的文件夾(dist-packages)到Python搜索路徑。您有多種選擇:

  1. 使用路徑配置(.pth)文件時,條目將追加到系統路徑中。
  2. 修改PYTHONPATH(從它的條目到系統路徑的開始)。
  3. 直接從您的Python腳本修改sys.path,即將必需的文件夾附加到它。

我認爲對於這個特殊情況下(啓用全局dist-packages文件夾)第三種選擇是更好的,因爲第一個選項,你必須創建.pth文件每VIRTUALENV你會被工作(與一些外部殼腳本?)。分發包裹時很容易忘記它。第二個選項需要運行時設置(添加一個envvar),這也是很容易丟失的。

只有第三個選項在配置或運行時不需要任何先決條件,並且可以毫無問題地分發(當然是在同一類型的系統上)。

您可以使用函數如下:

def enable_global_distpackages(): 
    import sys 
    sys.path.append('/usr/lib/python2.7/dist-packages') 
    sys.path.append('/usr/local/lib/python2.7/dist-packages') 

然後在__init__.py文件的包:

enable_global_distpackages() 
6

我剛開始我周圍的virtualenv頭,但似乎是一個比迄今爲止提到的方法更簡單。

  1. 由於virtualenv 1.7 --no-site-packages中已經默認行爲。 因此,使用virtualenv的--system-site-packages標誌就是在路徑中獲取dist-packages所需的全部內容 - 如果您使用Ubuntu發佈的經過調整的virtualenv。 (This answerthis one給出了一些有用的歷史)。我測試過了,它確實有效。

    $ virtualenv --system-site-packages .

  2. 我與托馬斯同意在這裏 - 我看不到在virtualenv中看到的dist-包的更新的效果所需要的任何行動。

  3. 經過測試python setup.py install,它確實(正如托馬斯所說的)仍然去dist-packages。你可以通過構建你自己的python來改變它,但這有點極端。

+0

適合我,謝謝! – axil

0

在目錄site-packages,創建一個文件dist.pth 在文件dist.path,把下面的: ../dist-packages

enter image description here

現在停用並激活您的virtualenv。你應該設置。

相關問題