2009-11-23 52 views
82

使用virtualenv時應遵循什麼樣的目錄結構?舉例來說,如果我正在建立一個WSGI應用程序,創建了一個名爲foobar的virtualenv我會這樣開始的目錄結構:一旦這種環境被創建在virtualenv中,自定義代碼在哪裏?

/foobar 
    /bin 
    {activate, activate.py, easy_install, python} 
    /include 
    {python2.6/...} 
    /lib 
    {python2.6/...} 

,哪裏會一個地方自己:

  • python文件?
  • 靜態文件(圖像/等)?
  • 「自定義」軟件包,例如那些可在網上找到但在奶酪店找不到的軟件包?

關於virtualenv的目錄?

(假設我已經知道where the virtualenv directories themselves should go。)

+6

@jkp:我不同意。如何佈置Python應用程序與您如何在虛擬環境中定位該應用程序以用於開發目的不同。這是相關的,但不一樣。請不要重複關閉。 – jcdyer 2009-11-23 16:09:43

回答

62

virtualenv提供了Python解釋器實例,而不是一個應用實例安裝到virtualenv中。您通常不會在包含系統默認Python的目錄中創建應用程序文件,同樣也不需要在virtualenv目錄中找到您的應用程序。

例如,您可能有一個項目,其中有多個應用程序使用相同的virtualenv。或者,您可能正在使用virtualenv測試應用程序,稍後將使用系統Python進行部署。或者,您可能打包了一個獨立的應用程序,讓virtualenv目錄位於應用程序目錄本身的某個位置,這可能是有意義的。

所以,總的來說,我不認爲這個問題有一個正確的答案。而且,關於virtualenv的一個好處是它支持許多不同的用例:不需要是一個正確的方法。

+4

同意。我使用virtualenv來處理所有事情,而且我從不將文件放在virtualenv目錄中。 Virtualenv需要對您的項目結構沒有影響;只需激活virtualenv(或使用它的bin/python),並無論你在哪裏擁有它們,都可以處理你的文件。 – 2009-11-23 20:31:10

+0

我也衷心地同意。我唯一一次*觸摸我的virtualenv(我使用'virtualenvwrapper')的任何文件是當我想編輯'postactivate'和'postdeactivate'鉤子。 – 2013-10-04 16:35:17

+0

問題會更好地服務於不同選項的具體實例,包括此問題其他答案中的權衡。 – user771555 2018-03-08 15:26:19

45

如果你只有幾個項目,每隔一段時間,沒有什麼可以阻止你爲它們建立一個新的virtualenv,並把你的包直接在:

/foobar 
    /bin 
    {activate, activate.py, easy_install, python} 
    /include 
    {python2.6/...} 
    /lib 
    {python2.6/...} 
    /mypackage1 
    __init__.py 
    /mypackage2 
    __init__.py 

這種方法的優點是您可以始終確保找到屬於該項目的激活腳本。

$ cd /foobar 
$ source bin/activate 
$ python 
>>> import mypackage1 
>>> 

如果你決定要有點更有條理,你應該考慮把所有的virtualenvs到一個文件夾,您正在使用的項目名字後,他們每個人。

/virtualenvs 
    /foobar 
     /bin 
     {activate, activate.py, easy_install, python} 
     /include 
     {python2.6/...} 
     /lib 
     {python2.6/...} 
    /foobar 
    /mypackage1 
     __init__.py 
    /mypackage2 
     __init__.py 

這樣,您就可以隨時出問題時,你的項目文件保持安全新的virtualenv開始。

另一個優點是你的幾個項目可以使用相同的virtualenv,所以如果你有很多依賴關係,你不必一遍又一遍的做同樣的安裝。

$ cd /foobar 
$ source ../virtualenvs/foobar/bin/activate 
$ python 
>>> import mypackage2 
>>> 

對於經常需要設置和拆除virtualenvs它將使意義看virtualenvwrapper用戶。

http://pypi.python.org/pypi/virtualenvwrapper 

隨着virtualenvwrapper可以

* create and delete virtual environments 

* organize virtual environments in a central place 

* easily switch between environments 

您不再擔心您的virtualenvs都在項目 「富」 與 「酒吧」 工作時:

/foo 
    /mypackage1 
     __init__.py 
    /bar 
    /mypackage2 
     __init__.py 

這你是如何開始在「foo」項目上工作的:

$ cd foo 
$ workon 
bar 
foo 
$ workon foo 
(foo)$ python 
>>> import mypackage1 
>>> 

然後切換到項目「欄」是如此簡單:

$ cd ../bar 
$ workon bar 
(bar)$ python 
>>> import mypackage2 
>>> 

整齊漂亮,不是嗎?

+0

我*強烈*贊同使用'virtualenvwrapper'的這個答案。它巧妙地將virtualenv抽象出來,同時仍然給你所有的好處。 – 2013-10-04 16:31:46

+2

但強烈*不贊同*將您的代碼放入虛擬環境中。如果你想把它放在文件系統的「接近」項目上,然後把'venv /'目錄放在與項目的'BASE_DIR'相同的級別上。 – 2014-08-15 11:09:43

2

如果你給你的項目一個setup.py,pip可以直接從版本控制中導入它。

做這樣的事情:

$ virtualenv --no-site-packages myproject 
$ . myproject/bin/activate 
$ easy_install pip 
$ pip install -e hg+http://bitbucket.org/owner/myproject#egg=proj 

-e將把項目myproject/src,但其鏈接到myproject/lib/pythonX.X/site-packages/,所以你做會得到來自當地site-packages導入模塊立刻拿起任何改變。 #egg位告訴pip你要給它創建的蛋包名稱。

如果你不使用--no-site-packages,要小心指定要PIP與-E選項

21

由於virtualenvs不可重新定位,在我看來,將您的項目文件放置在virtualenv目錄中是不好的做法。 virtualenv本身是生成的開發/部署工件(有點像.pyc文件),而不是項目的一部分;應該很容易將它吹走並隨時重新創建它,或者在新的部署主機上創建一個新的等。

許多人實際上使用virtualenvwrapper,它幾乎完全從您的意識中刪除了實際的virtualenvs,將它們放置在默認情況下所有並行的$ HOME/.virtualenvs。