所以每个人都告诉我使用 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 ....)
例如,假设我有一个项目名称“projectfoo”,它依赖于 django-1.2.3、pygeoip-0.1.3 和 psycopg2,我将拥有:
/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 依赖项:
非python-only依赖项将以相同的方式处理,我无法使用--no-site-packages
virtualenv 选项并在我的服务器上安装编译器和所有构建依赖项,我认为实际上没有人这样做反正。
使用我当前的方法升级仅 python 的依赖项:
我在 src 中签出/解压缩新版本,从 src 中删除旧版本,更新 lib 中的符号链接并提交。现在从事该项目的其他所有人都将在他们的下一个svn up
或git pull
. 不好的一件事是,如果 src 中的旧文件夹包含一些 pyc 文件,它将保留,这可以通过在更新本地副本之前删除所有 pyc 轻松避免。
使用 PIP/virtualenv 升级仅 python 的依赖项:
您提交了一个新版本的需求文件,希望每个参与该项目的人在更新本地副本并运行pip install -E projectfoo-venv -r requirements.txt
.
编辑:我在 pip 中删除了 -U 的使用,这在 pip 8.2 中不需要
编辑:与我目前的方法相比,pip/virtualenv 的唯一优势似乎是当您处理需要不同版本的 python 的不同项目时。但是根据我的经验,当你需要不同版本的 python 时,你还需要不同版本的其他系统库(PIL、psycopg2、...),而 virtualenv 对此无济于事(除非你足够疯狂地使用 -- no-site-package 选项,即使那样它也不完整)。对于这种情况,我能想到的唯一解决方案是使用不同的虚拟机。
那么我错过了什么?有人可以指出一个 PIP 或 virtualenv 比我正在做的更好的用例吗?