2009-10-14 76 views
12

我搞砸了buildout和virtualenv的組合,以設置一個孤立的 Python的開發環境,允許做可重複的構建。構建和Virtualenv

有用於擴建配方,它可以讓你整合的virtualenv到擴建:

tl.buildout_virtual_python 

有了這個我buildout.cfg看起來是這樣的:

[buildout] 
develop = . 
parts = script 
     virtualpython 


[virtualpython] 
recipe = tl.buildout_virtual_python 
headers = true 
executable-name = vp 
site-packages = false 

[script] 
recipe = zc.recipe.egg:scripts 
eggs = foo 
python = virtualpython 

這將部署兩個可執行文件到./ bin /:

vp 
script 

當我執行vp時,我得到一個交互式的,孤立的python對話框,作爲e xpected(無法從系統加載任何軟件包)。 我現在所期待的是,如果我跑

./bin/script 

,分離Python解釋器使用。但它並沒有,它不是孤立的「vp」(意思是我可以從系統級導入庫)。但是我可以運行:

./bin/vp ./bin/script 

這將在我希望的隔離環境中運行腳本。但是必須有一種方法來指定這樣做,而不用鏈接命令,否則buildout只能解決我希望的一半問題:)

感謝您的幫助! 帕特里克

回答

8

你不需要virtualenv:buildout已經提供了一個隔離的環境,就像virtualenv一樣。

作爲一個例子,看看在bin目錄中生成的文件buildout。他們會碰到這樣的:

import sys 
sys.path[0:0] = [ 
    '/some/thing1.egg', 
    # and other things 
    ] 

所以sys.path被完全想要的擴建有路徑替換爲:相同的隔離方法的virtualenv。

+0

關於virtualenv的好處是它修改PATH,因此腳本可以有「#!/ usr/bin/env python「就像他們應該這樣做,他們將使用buildout版本。沒有virtualenv可以做到這一點嗎? – Xentac 2010-02-09 18:32:37

+0

virtualenv修改路徑,但這也意味着您不應該在每次使用腳本時都忘記*以啓用virtualenv。在這方面,建設有更持久的解決方案。 buildout指出你的腳本的「#!...」行是在你的build中運行的真正的python中,所以它對你的機器是正確的。 沒有virtualenv?您可以編寫一個shell腳本,將PYTHONPATH設置爲特定的內容並獲得某些* virtualenv的功能。但不是全部,特別是在安裝時。 – 2010-02-10 14:04:28

+7

快速更正:'sys.path [0:0] = [...]'不能完全代替sys.path,它只是在它的開頭插入更多的項目。 – 2010-10-06 18:01:37

0

我以前從來沒有使用的配方,但我會嘗試的第一件事情是這樣的:

[buildout] 
develop = . 
parts = script 
     virtualpython 


[virtualpython] 
recipe = tl.buildout_virtual_python 
headers = true 
executable-name = vp 
site-packages = false 

[script] 
recipe = zc.recipe.egg:scripts 
eggs = foo 
python = virtualpython 
interpreter = vp 

如果不工作,你通常可以在這種情況下打開腳本( vp和腳本),並查看他們正在使用的Python路徑。如果你在windows上,通常會有一個名爲<script_name>-script.py的文件。在這種情況下,這將是vp-script.py和script-script.py。

+0

我也考慮過使用「解釋器」選項。如果我這樣做,代碼將破壞: djungle:buildout-test pbonzli $ ./bin/vp ./bin/vp:line 3:import:command not found ./bin/vp:line 5:sys。路徑[0:0]:找不到命令 etc ... 也許是一個腳本中的錯誤,我不知道... – Patrick 2009-10-15 08:07:08

3

如果在Ubuntu服務器上使用引導程序運行buildout,那麼我會一起使用virtualenv和buildout。只需創建virualenv並在其中安裝構建。這種方式只有virtualenv必須安裝到系統(理論上)。

$ virtualenv [options_you_might_need] virtual 
$ source virtual/bin/activate 
$ pip install zc.buildout 
$ buildout -c <buildout.cfg> 

還告訴擴建把它的腳本在虛擬/ bin /目錄下,這樣的腳本出現在$PATH

[buildout] 
bin-directory = ${buildout:directory}/virtual/bin 
... 

1:在實踐中,你可能會需要什麼樣的雞蛋需要編譯那些需要編譯系統的水平。雞蛋如mysql或memcache。

5

zc.buildout 2.0及更高版本不再提供隔離環境

virtualenv 1.9和更高版本提供完全隔離(包括不安裝setuptools)。

因此,要得到一個完整的控制環境擴建的最簡單方法是執行下列步驟(這裏即對於廣泛使用的Python 2.7):

cd /path/to/buildout 
rm ./bin/python 
/path/to/virtualenv-2.7 --no-setuptools --no-site-packages --clear . 
./bin/python2.7 bootstrap.py 
./bin/buildout 

前提條件:

  • bootstrap.py必須是最近與您正在使用的buildput版本相匹配的一個。你會發現在http://downloads.buildout.org/2/

  • 是否有你的擴建任何版本銷最新,確保它們不會銷擴建本身或配方/擴展與zc.buildout 2或更高版本不兼容的版本。