python:pythonbrew和virtualenv有什么区别?

我是新的python,我正在计划学习django。 我有一些ruby( 不轨 )的经验,我熟悉RVM,但我不明白pythonbrewvirtualenv之间的区别。 我知道pythonbrewRVM的 模拟器 ,但我认为virtualenv已经在做RVM的工作(反之亦然, pythonbrew已经在做RVM的工作了)。 有人可以请解释,也许提供一些具体的例子/用法来帮助我理解它。 非常感谢!

Pythonbrew类似于Ruby的rvm :这是一个shell函数,可以让你:

  • 构build一个或多个完整的独立版本的Python,每个版本都存储在本地目录下。 您可以通过这种方式构build多个版本的Python。
  • 在Python的版本之间轻松切换。

你所构build的Python是完全相互隔离的,而且从任何版本的Python被安装在系统范围内。

Virtualenv是相似的,但不完全相同。 它创build了一个Python虚拟环境,在概念上,它位于现有Python安装(通常是系统范围的安装,但并非总是)上。 默认情况下,在Unix平台(和Mac)上,它会创build到各种Python库模块的符号链接,所以你可以通过“真正的”底层Python实现来真正地共享这些模块。 但是,virtualenv有自己的“bin”目录和“site-packages”目录。 您在Python虚拟环境中安装的任何东西只能在该环境中使用。

Pythonbrew的一个优势是它所创build的Python环境是真正的,完全独立的。 它们不能被任何在底层Python安装中搞砸的东西所污染,因为没有底层的基本安装。 在virtualenv环境中这不是真的。 如果你创build了一个virtualenv Python,然后你以某种方式搞砸了它所在的基本Python实例(例如,在以root身份login时,意外删除了基本Python的“site”目录的一部分),那么你将把任何基于virtualenv的环境在那个Python上。

然而,virtualenv有自己的优势。 可能最大的好处就是轻便。 由于Pythonbrew从头开始编译Python,为了创build它的一个环境,创build一个Pythonbrew Python环境需要一些时间。 相比之下,创build一个virtualenv Python环境非常快。

事实上,你可以一起使用它们。 以下是您可能想要这样做的一种情况。

  • 您的基础系统使用Python 2.6。
  • 你需要安装Python 2.7。
  • 无论出于何种原因,您不能(或不想)在Python 2.6系统上安装Python 2.7。

在这种情况下,你可以使用Pythonbrew 在你的主目录下安装一个基本的Python 2.7,它不会和别处安装的东西冲突。 然后,您可以创build一个或多个基于Pythonbrew安装的2.7 Python的轻量级virtualenv Python环境。 例如,你可以使用virtualenv以这种方式为Python 2.7创build短暂的testing环境。

我怀疑大多数人是这样做的。 (我不这样做)但是没有理由不能。

为什么我从来没有听说过PythonBrew的价值,但我知道(和爱)virtualenv。

Virtualenv用于创build单独的环境, 基于您的机器上的Python安装。 也就是说,如果我有python 2.7,我可以创build一些独立的python 2.7环境,但是我不能创buildpython2.6环境。

据此(我通过谷歌发现)Pythonbrew似乎是专注于安装其他的Python版本。 所以我想你会使用brew来安装py2.6和2.7,然后使用virtualenv为每个环境创build环境。

或者,看起来,brew也可以使用virtualenv来创build环境。

为什么一个不同的Python解释器不是一个真正的孤立的环境。

每个python安装都有一套软件包(放在'site-packages'中)。 如果你安装了一个新的软件包,它会被添加到这个集合中,并可用于你所有的Python代码。

这可能是一个问题,如果你有一个项目,你build立在Django0.96上,你想用Django1.3开始一个新的项目。 如果你只是更新你的系统版本的Django,也会影响你旧的项目。

用virtualenvs你可以用Django1.3创build一个环境,用Django0.96创build另一个环境,都是python2.7。 如果你可以在python2.6中运行你的老项目,在python2.7中运行你的老项目,你也可以这样做,但是接下来的两个项目使用Django-Trunk的diffenret版本呢?

python酿造是为了build设和安装,也许就像一些buildbot。 我不是很熟悉。 Virtualenv主要用于,当你有不同版本的Python,或者你想尝试一些包,而不会干扰在系统版本。


好吧,这个狂欢的东西

创build独立的Python环境(使用virtualenv ):

pythonbrew venv init pythonbrew venv create proj pythonbrew venv list pythonbrew venv use proj pythonbrew venv delete proj 

http://pypi.python.org/pypi/pythonbrew/

由于上面所有的答案都很老,我想在这里总结一下我的发现。 从rvm / ruby​​发布之后,我试图弄清楚它是如何与Python协同工作的,并且无法在网上find清楚的解释。

所以我们在MacOS上有以下选项:

自制软件(仅适用于MacOS)

…可以安装pythonpython3 。 他们将被存储在Homebrew的酒窖中,并从/usr/local/bin 。 使用brew安装的默认python是2.7.6截至目前。

使用pip安装的软件包将进入默认位置(您也有pippip3链接)。

Pyenv(Pythonbrew的继任者)

…是一种替代Homebrew(MacOS)的方式来安装和维护多个版本的Python。 Linux没有自制软件,所以Pyenv就是专门用于Python的版本。 它也从源代码构buildPython。

Pyenv保留~/.pyenv/versions/ python安装,并允许在二进制文件( pythonpip等)之间快速切换和使用相同的名称。 它使用“shim”二进制文件,它们是伪造的二进制文件,如pythonpip等,它们模仿Python,而不是将执行静静地redirect到当前活动的版本。

使用pip安装的软件包将进入活动的Python安装。

所以,这些方法都不足以为每个项目维护单独的python安装包版本集(如rm和gemset)。 因此:

VIRTUALENV

…是最接近rvm的。 引用这个post :

它通过从主Python安装中复制或链接文件来创build新的bin目录和lib目录,从而在新目录中设置Python的干净副本

所以它使用Python当前活动副本并将其复制到一个单独的目录中。 virtualenvwrapper增加了pipe理这些环境的function,并像使用rvm一样使用cd自动激活它们。

这允许隔离用于每个项目的python版本和库。 但是,它不会自行安装python版本。

因此,听起来像大多数人使用pyenv + virtualenvbrew + virtualenv (brew是Macos当然具体)的组合。 第一部分是用来安装python版本的(如果需要的话),第二部分是为不同的项目克隆它们并在它们之间切换。

PS:我刚开始弄清楚,如果这里有任何错误,请纠正我。

PPS:在我看来,这整个业务可以通过结合pyenv和virtualenv在一个屋檐下改善…

 "pythonbrew is a program to automate the building and installation of Python in the users $HOME." 

相比之下,virtualenv为开发一个项目提供了一个独立的环境 – 它将该项目的所有库保存在一个地方,这使得重新部署(以及部署)项目变得更容易。