python:pythonbrew和virtualenv有什么区别?

时间:2011-11-24 12:03:05

标签: python ruby rvm virtualenv pythonbrew

我是python的新手,我打算学习django。我对ruby(而不是rails)有一些经验,我熟悉 RVM 但是我不明白 pythonbrew 之间的区别和 virtualenv 。我知道 pythonbrew RVM的模仿,但我认为 virtualenv 已经在做RVM所做的事情(反之亦然< strong> pythonbrew 已经在做RVM的工作了。有人可以解释一下,或许可以提供一些具体的例子/用法来帮助我理解它。非常感谢!

5 个答案:

答案 0 :(得分:51)

Pythonbrew类似于Ruby的 rvm :它是一个shell函数,允许您:

  • 构建一个或多个完整的自包含Python版本,每个版本都存储在本地 在您的主目录下。您可以通过这种方式构建多个版本的Python。
  • 轻松切换Python版本。

你构建的Pythons彼此完全隔离,并且从系统范围内安装的任何Python版本开始。

Virtualenv类似,但不完全相同。它创建了一个Python虚拟环境,从概念上讲,它位于一些现有的Python安装之上(通常是系统范围的安装,但并非总是如此)。默认情况下,在Unix平台(和Mac)上,它会创建指向各种Python库模块的符号链接,因此您可以使用“真正的”底层Python实现来共享这些模块。但是,virtualenv有自己的“bin”目录和“site-packages”目录。您在Python虚拟环境中安装的任何额外内容仅在该环境中可用。

Pythonbrew的一个优点是它创建的Python环境是真正的,完全自包含的。它们不会被任何在基础Python安装中搞砸的东西污染,因为没有底层的基础安装。对于virtualenv环境而言,情况并非如此。如果你创建了一个virtualenv Python,然后你以某种方式搞砸了它所在的基础Python实例(例如,在以root用户身份登录时意外删除了基本Python的“站点”目录的一部分),你将搞砸任何virtualenv环境也就是那个Python。

然而,virtualenv有其自身的优势。可能最大的优点是它很轻巧。由于Pythonbrew从头开始编译Python,要创建一个环境,创建Pythonbrew Python环境需要一些时间。相比之下,创建virtualenv Python环境非常快。

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

  • 您的基本系统使用Python 2.6。
  • 您需要安装Python 2.7。
  • 无论出于何种原因,您都不能(或者不想)在系统范围内安装Python 2.7, 与Python 2.6并排。

在这种情况下,您可以使用Pythonbrew在您的主目录下安装基本Python 2.7 ,它不会与其他地方安装的任何内容冲突。然后,您可以创建一个或多个基于Pythonbrew安装的2.7 Python的轻量级virtualenv Python环境。例如,您可以使用virtualenv以这种方式为Python 2.7启用短期测试环境。

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

答案 1 :(得分:4)

我之前从未听说过PythonBrew的价值,但我知道(和爱)virtualenv。

Virtualenv用于在您的计算机上安装的python上创建单独的环境 based 。也就是说,如果我有python 2.7,我可以创建一些隔离的python 2.7环境,但是我无法创建python2.6环境。

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

或者,似乎'brew也可以使用virtualenv创建环境。

为什么不同的python解释器实际上不是一个孤立的环境。

每个python安装都有一组包(我认为放在'site-packages'中)。如果您安装了一个新包,它将被添加到该集合中,并且可用于您的所有python代码。

如果您在Django0.96上构建了一个项目并且想要使用Django1.3启动一个新项目,那么这可能是个问题。如果您只是更新Django的系统版本,那也会影响您的旧项目。

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

答案 2 :(得分:2)

Python brew用于构建和安装,可能就像一些buildbot。我不太熟悉。 Virtualenv主要用于,当你有不同版本的python,或者你想尝试一些包而不会打扰系统版本。


好的,这会让人感到高兴

创建隔离的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/

答案 3 :(得分:1)

由于上述所有答案都很陈旧,我想在此总结一下我的发现。来自rvm / ruby​​之后,我试图弄清楚它是如何与Python一起工作的,并且无法在网上找到明确的解释。

因此我们在Macos上有以下选项:

Homebrew(仅适用于MacOS)

...可以安装pythonpython3。它们将存储在Homebrew的Cellar中,并与/usr/local/bin进行符号链接。截至目前,使用python安装的默认brew为2.7.6。

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

Pyenv(Pythonbrew的继任者)

...可以替代Homebrew(在Macos上)安装和维护多个版本的Python。 Linux没有Homebrew,所以Pyenv只是Python的专用版本。它还从源代码构建Python。

Pyenv将python安装保存在~/.pyenv/versions/中,允许快速切换并使用二进制文件的相同名称(pythonpip等)。它使用“shim”二进制文件,它们是假的二进制文件,如pythonpip等,它们模仿Python,而只是默默地将执行重定向到当前活动的版本。

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

因此,这些方法都不足以维持每个项目单独的python安装包版本集(如rvm对gemsets一样)。因此:

VIRTUALENV

...是最接近rvm的东西。引用this post

  

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

因此它使用当前活动的Python 副本并将其复制到一个单独的目录中。 virtualenvwrapper添加了管理这些环境的功能,并使用cd自动激活它们,就像rvm一样。

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

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

PS:我刚刚开始弄明白,如果有任何错误,请纠正我。

PPS:在我看来,通过将pyenv和virtualenv结合在一起,可以改善整个业务......

答案 4 :(得分:0)

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

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