Python:Pythonbrew和Virtualenv有什么区别?

38

我刚接触Python,计划学习Django。之前略有Ruby(不是Rails)的经验,并了解RVM。然而,我不明白pythonbrewvirtualenv之间的区别。我知道pythonbrewRVM的模拟版本,但我想virtualenv已经实现了RVM的功能(或者反过来说,pythonbrew已经实现了RVM的功能)。请问有人可以解释一下并提供一些具体的例子/用法来帮助我理解吗?非常感谢!


相关链接:http://stacktoheap.com/blog/2013/03/11/why-use-virtualenv-when-there-is-pythonbrew/ - manojlds
注意Google员工:pythonbrew现已弃用,请改用pyenv - Will
抱歉挖掘旧帖,但我有同样的问题,下面的答案不清楚/已过时自2011年以来。因此,我根据我的理解添加了另一个答案-请检查并根据需要进行更正。 - alexandroid
5个回答

52

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

  • 构建一个或多个完整的独立Python版本,并将其存储在本地主目录下。您可以通过这种方式构建多个Python版本。
  • 轻松切换Python版本。

您构建的Python版本彼此完全隔离,并且与系统范围内安装的任何Python版本也没有关联。

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

Pythonbrew的一个优点是它创建的Python环境是真正且完全独立的。如果基础Python安装程序中出现问题,将无法污染Pythonbrew创建的Python环境,因为不存在基础安装程序。这对于virtualenv环境并非如此。如果您创建一个virtualenv Python,然后以root用户身份登录并意外删除基础Python的“site”目录的某些部分,则也会破坏该Python基础上的任何virtualenv环境。

但是,virtualenv有自己的优点。可能最大的优点是它很轻量级。由于Pythonbrew从头编译Python来创建其中的环境,创建Pythonbrew Python环境需要一些时间。相比之下,创建virtualenv Python环境真的很快。

实际上,您可以将它们结合使用。下面是一个您可能想要这样做的情况:

  • 您的基础系统使用Python 2.6。
  • 您需要安装Python 2.7。
  • 由于某种原因,您无法(或不想)在Python 2.6旁边在系统范围内安装Python 2.7。
在这种情况下,你可以使用Pythonbrew在你的主目录下安装基础Python 2.7,这样它就不会与其他地方安装的任何东西发生冲突。然后,你可以创建一个或多个基于Pythonbrew安装的2.7 Python虚拟环境。例如,你可以使用virtualenv以此方式启动短暂的Python 2.7测试环境。
我怀疑大多数人实际上并不这样做(我也没有这样做)。但是你完全可以这么做。

2
同意所有的观点,但是对你最后一句话很好奇。我经常同时使用Pythonbrew和virtualenv。这似乎是保持开发和生产环境同步的唯一明智的方法。 - Jeff Bauer
1
就像我说的,我通常不会这样做。我怀疑大多数人也不会。但是有很好的理由去这样做,而且显然你已经找到了其中一个。 - Brian Clapper

4

就我所知,PythonBrew我从未听说过,但我知道(并且喜欢)virtualenv。

Virtualenv用于创建基于您机器上安装的Python版本的单独环境。也就是说,如果我有Python 2.7,我可以创建许多隔离的Python 2.7环境,但我不能创建Python 2.6环境。

根据此处(通过谷歌发现),Pythonbrew似乎专注于安装其他Python版本。因此,我想您可以使用'brew'来安装py2.6和2.7,然后使用virtualenv为每个版本创建环境。

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

为什么不同的Python解释器并不是真正的隔离环境。

每个Python安装都有一组软件包(我认为放置在'site-packages'中)。如果您安装了新软件包,则会将其添加到此集合中,并可供所有Python代码使用。

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

使用virtualenv,您可以创建一个环境,其中一个是Django1.3,另一个是Django0.96,两者都是Python2.7。如果您愿意在Python2.6中运行旧项目,并在Python2.7中运行新项目,则也可以这样做,但是如果您的下两个项目使用不同版本的Django-Trunk呢?


如果我使用pythonbrew安装不同版本的Python,那么我不是已经创建了隔离的Python环境吗?我想我缺少的是在同一台机器上安装不同版本的Python与隔离环境之间的区别理解。 - Jeff
1
如果pythonbrew允许多个相同Python版本的安装,则我认为它们是相同的。我已经在答案中添加了一些信息。 - Pengman
谢谢。当你提到“多次安装相同版本的Python”时,我的脑海中一下子就有了想法。我猜Ruby RVM可能做不到这一点,这就是为什么Rails现在有Bundler来解决这个问题。但是我的知识有限,我可能是错的。 - Jeff

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

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


但是Pythonbrew也可以安装不同版本的Python并在安装的版本之间切换。您可以在此处查看https://github.com/utahta/pythonbrew,寻找用法! - Jeff
@wliao 你为什么这样认为? - aaron

1
由于以上所有答案都比较旧,我想在这里总结一下我的发现。我试图从rvm/ruby转到Python并尝试弄清楚它是如何工作的,但无法在网上找到清晰的解释。
因此,在Macos上我们有以下选项:
Homebrew(仅限MacOS)
...可以安装python和python3。它们将存储在Homebrew的Cellar中,并从/usr/local/bin进行符号链接。默认情况下,使用brew安装的python是2.7.6。
使用pip安装的软件包将放置在默认位置(还将pip和pip3进行符号链接)。
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 添加了管理这些环境并像 rvm 一样使用 cd 自动激活它们的功能。
这允许为每个项目隔离使用的 python 版本和安装的库。然而,它不会安装 python 版本本身。
因此,似乎大多数人使用 pyenv + virtualenv 或 brew + virtualenv 的组合(当然,brew 是针对 Macos 的) 。第一个部分用于安装 Python 版本(如果需要),第二个部分用于为不同的项目克隆并在它们之间切换。
PS:我只是开始弄清楚,请纠正我是否有任何错误。
PPS:在我看来,通过在一个地方结合 pyenv 和 virtualenv 可以改进整个业务...

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接