38

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

4

5 回答 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 安装中搞砸的东西所污染,因为没有底层基础安装。这不适用于 virtualenv 环境。如果你创建了一个 virtualenv Python,然后你以某种方式搞砸了它上面的基础 Python 实例(例如,在以 root 身份登录时不小心删除了基础 Python 的“站点”目录的一部分),你将搞砸任何基于 virtualenv 的环境在那个 Python 上,也是。

但是,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 环境。例如,您可以使用 virtualenv 以这种方式为 Python 2.7 启动短期测试环境。

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

于 2011-12-01T21:18:47.960 回答
4

对于它的价值,我以前从未听说过 PythonBrew,但我知道(并且喜欢)virtualenv。

Virtualenv 用于根据您机器上的 python 安装创建单独的环境。也就是说,如果我有 python 2.7,我可以创建许多独立的 python 2.7 环境,但我不能创建 python2.6 环境。

据此(通过谷歌找到)Pythonbrew 似乎专注于安装其他 python 版本。所以我猜你会使用 'brew 来安装 py2.6 和 2.7,然后使用 virtualenv 来为它们创建环境。

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

为什么不同的 python 解释器并不是真正的孤立环境。

每个 python 安装都有一组包(我认为放在“站点包”中)。如果你安装一个新包,它会被添加到这个集合中,并且可用于你的所有 python 代码。

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

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

于 2011-11-24T13:19:34.110 回答
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/

于 2011-11-24T12:40:06.470 回答
1

由于上面的所有答案都很老,我想在这里总结一下我的发现。在来自 rvm/ruby 之后,我试图弄清楚它是如何与 Python 一起工作的,但在网上的任何地方都找不到明确的解释。

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

自制软件(仅限 MacOS)

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

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

Pyenv(Pythonbrew 的继承者)

...是 Homebrew(在 Macos 上)安装和维护多个 Python 版本的替代方法。Linux 没有 Homebrew,因此 Pyenv 是一种专门用于 Python 的版本。它还从源代码构建 Python。

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

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

因此,这些方法都不足以为每个项目维护单独的 python 安装包版本集(就像 rvm 对 gemsets 所做的那样)。因此:

虚拟环境

...是最接近 rvm 的东西。引用这篇文章

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

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

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

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

PS:我刚开始弄明白,如果这里有什么错误,请纠正我。

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

于 2014-02-23T09:34:29.987 回答
0
"pythonbrew is a program to automate the building and installation 
 of Python in the users $HOME."

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

于 2011-11-24T12:09:32.507 回答