簡體   English   中英

pip 和 virtualenv 有什么好處?

[英]What are the benefits of pip and virtualenv?

所以每個人都告訴我使用 pip 和 virtualenv,但沒有人能夠向我解釋它如何比我目前的方法更好。 人們使用 pip 和 virtualenv 的主要原因似乎是其他人都在使用它......

我確信使用 PIP 和 virtualenv 有很好的理由,但我無法通過 Google 找到它們。 我希望來自 stackoverflow 社區的人能夠向我解釋它們。

以下是我目前組織 Django 項目的方式:

site/src/ : contains all python-only dependencies of my project

site/lib/ : contains symlinks to the python packages

site/[projectname]/ : contains all my project specific code

整個站點文件夾都在我的存儲庫中檢查(是的,包括所有僅 python 依賴項,例如 django 本身)。

所有非 python 依賴項(PIL、psycopg2、...)都記錄在自述文件中並安裝在系統級別(apt-get install ....)

例如,假設我有一個依賴於 django-1.2.3、pygeoip-0.1.3 和 psycopg2 的項目名稱“projectfoo”,我將擁有:

/usr/lib/python2.5/site-packages/psycopg2

~/projects/foo/site : checkout of my repository
~/projects/foo/site/src/django-1.2.3
~/projects/foo/site/src/pygeoip-0.1.3
~/projects/foo/site/lib/django -> symlink to ../src/django-1.2.3/django
~/projects/foo/site/lib/pygeoip -> symlink to ../src/pygeoip-0.1.3/pygeoip
~/projects/foo/site/projectfoo/

現在這與實踐中的 PIP/virtualenv 相比如何?

使用我目前的方法部署項目

svn checkout https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/site

使用 PIP/virtualenv 部署

wget https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/projectfoo-requirements.txt
pip install -U -E projectfoo-venv -r projectfoo-requirements.txt

用我目前的方法處理一個項目

cd ~/projects/foo/site/projectfoo
export PYTHONPATH=.:..:../lib
./manage.py runserver 0:8000

使用 PIP/virtualenv 處理項目

workon projectfoo
cd path/to/project
./manage.py runserver 0:8000

處理非 python-only 依賴項

非 python-only 依賴項將以相同的方式處理,我不可能使用 virtualenv 的--no-site-packages選項並在我的服務器上安裝編譯器和所有構建依賴項,我不無論如何,不​​要認為任何人實際上都在這樣做。

使用我當前的方法升級僅 python 依賴項

我在 src 中簽出/解壓縮新版本,從 src 中刪除舊版本,更新 lib 中的符號鏈接並提交。 現在,在該項目上工作的其他所有人都將在下一次svn upgit pull獲得更新。 不好的一件事是,如果 src 中包含一些 pyc 文件,則 src 中的舊文件夾將保留,這可以通過在更新本地副本之前刪除所有 pyc 來輕松避免。

使用 PIP/virtualenv 升級僅 python 依賴項

你提交了一個新版本的需求文件,希望項目中的每個人在更新他們的本地副本時都會注意到新版本,然后他們運行pip install -E projectfoo-venv -r requirements.txt

編輯:我刪除了 -U 與 pip 的使用,這在 pip 8.2 中不需要

編輯: pip/virtualenv 與我目前的方法相比的唯一優勢似乎是當您處理需要不同版本的 python 的不同項目時。 但是根據我的經驗,當您需要不同版本的 python 時,您還需要不同版本的其他系統庫(PIL、psycopg2 等),而 virtualenv 對此無濟於事(除非您瘋狂到使用 -- no-site-package 選項,即使這樣它也不完整)。 對於這種情況,我能想到的唯一解決方案是使用不同的虛擬機。

那么我錯過了什么? 有人可以指出一個用例,其中 PIP 或 virtualenv 會比我正在做的更好嗎?

當您有多個項目並且不希望它們共享相同的 Python 安裝時,virtualenv 真的很出色。 例如,您可能有兩個需求沖突的項目。

“所有非 python 依賴項(PIL、psycopg2、...)都記錄在自述文件中並安裝在系統級別(apt-get install ....)”

那么不同的項目就不能有不同的依賴,不同的項目不能有這些依賴的不同版本。

這樣做的一個影響是您的本地安裝不能准確反映生產機器,因此您可能在重現生產錯誤時遇到問題,例如。

如果您安裝需要一個版本的系統工具,您將被迫在任何地方使用相同的版本,這可能會破壞您的項目。

此外,取消刪除模塊需要在系統 python 級別上完成。 Virtualenv 意味着你可以設置一個 python 安裝來測試東西,而不會污染系統安裝。

我絕對建議為您的項目使用單獨的 Python,並使用一些將 Python 與項目隔離的東西,例如 virtualenv 或 zc.buildout。

PIP 只是安裝模塊的一種更簡單的方法,它還可以幫助您卸載它們。

“我不可能使用 virtualenv 的 --no-site-packages 選項並在我的服務器上安裝編譯器和所有構建依賴項,我認為無論如何都沒有人真正這樣做。”

不,我使用 zc.buildout,但它大致相同,但工作量更少。 ;)

我按照您為我通常的項目建議的方法而沒有 pip/virtualenv。 這允許我將包放在特定目錄中。

+ext
  |
  |------python packages
+source
  |
  |------ project code and packages

通常在啟動腳本中我更新 PYTHONPATH

export PYTHONPATH="";
export PYTHONPATH="${PYTHONPATH}:${workingdir}/path/to/ext";

這具有保持項目和依賴項自包含的優點。 我附和,你的想法在這里。

然而,我發現使用 virtualenv,當

  1. 我必須嘗試something new
  2. 當我想使用two different versions of package並比較它們時,效果會更好。
  3. 另一個用途是,我保留different related packages that can be used across projects

例如:文檔:我安裝的一些關鍵包包括 sphinx、pygraphwiz、nterworkX 和一些更多的可視化包。 我在項目中使用它,並且將它放在系統級安裝之外以保持它不受污染。

我也想讓你結賬:蛋黃。 我發現 pip/virtualenv 的組合很好。

你可以列出包

yolk -l
Jinja2          - 2.5.5        - active 
Markdown        - 2.0.3        - active 
Pycco           - 0.1.2        - active 
......

並查看 pypi 更新。

yolk --show-updates
Pycco 0.1.2 (0.2.0)
Sphinx 1.0.4 (1.0.5)
pip 0.8.1 (0.8.2)

使用 PIP/virtualenv 部署:

照你說的:

 wget https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/projectfoo-requirements.txt pip install -U -E projectfoo-venv -r projectfoo-requirements.txt

我做什么:我也“凍結”包,但我用pipvirtualenv來做,並檢查整個項目; 包括 Python 包。 所以我的部署和你的完全一樣:

svn checkout https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/site

使用 PIP/virtualenv 處理項目:

照你說的:

 workon projectfoo cd path/to/project ./manage.py runserver 0:8000

我的工作:添加一個像這樣的postactivate 鈎子

$ cat bin/postactivate
cd $VIRTUAL_ENV
./manage.py runserver 0:8000
$

現在,要更改為項目:

workon projectfoo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM