【问题标题】:python: what's the difference between pythonbrew and virtualenv?python:pythonbrew 和 virtualenv 有什么区别?
【发布时间】:2012-01-05 14:28:15
【问题描述】:

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

【问题讨论】:

  • Google 员工注意:pythonbrew 现在是 deprecated,请查看 pyenv
  • 很抱歉复活了一个旧线程,但我提出了同样的问题,自 2011 年以来,下面的答案并不清楚/过时。所以我根据下面的理解添加了另一个答案 - 请检查并更正为需要。

标签: python ruby rvm virtualenv pythonbrew


【解决方案1】:
"pythonbrew is a program to automate the building and installation 
 of Python in the users $HOME."

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

【讨论】:

    【解决方案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/

    【讨论】:

    • 但是pythonbrew也可以安装不同版本的python,并在安装的版本之间切换。你会明白我的意思在这里github.com/utahta/pythonbrew寻找用法!
    • @wliao 你为什么这么认为?
    【解决方案3】:

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

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

    根据this(我通过谷歌找到),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 的不同版本呢?

    【讨论】:

    • 那么,如果我使用 pythonbrew 安装不同版本的 python,我不是已经创建了独立的 python 环境吗?我想我缺少的是安装在同一台机器上的不同版本的 python 与隔离环境之间的理解。
    • 如果 pythonbrew 允许多次安装相同的 python 版本,那么我认为它们是相同的。我在答案中添加了一些信息。
    • 谢谢。当您提到“多次安装相同版本的python”时,我的想法就点击了。我猜 ruby​​ rvm 不能做到这一点,这就是为什么 rails 现在有 Bundler 来解决这个问题。但我可能知识有限。
    【解决方案4】:

    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.7, 与 Python 2.6 并行。

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

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

    【讨论】:

    • 同意一切,但对你的最后一句话感到好奇。我一直一起使用 Pythonbrew 和 virtualenv。这似乎是让我的开发和生产环境保持同步的唯一明智的方法。
    • 正如我所说,我通常不会那样做。我怀疑大多数人都没有。但是有充分的理由这样做,而且很明显,你已经找到了。
    【解决方案5】:

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

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

    自制软件(仅限 MacOS)

    ...可以安装pythonpython3。它们将存储在 Homebrew 的酒窖中,并通过/usr/local/bin 进行符号链接。截至目前,使用brew 安装的默认python 为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 所做的那样)。因此:

    虚拟环境

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-24
      • 2018-12-01
      • 2020-05-05
      • 2016-11-08
      • 2015-12-24
      • 2017-05-25
      相关资源
      最近更新 更多