我是 python 新手,我打算学习 django。我对 ruby(不是 rails)有一点经验,我对RVM很熟悉,但是我不明白pythonbrew和virtualenv之间的区别。我知道pythonbrew是RVM的模仿,但我认为virtualenv已经在做 RVM 所做的事情(反之亦然,pythonbrew已经在做 RVM 所做的事情)。有人可以解释一下,也许可以提供一些具体的例子/用法来帮助我理解它。非常感谢!
5 回答
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 启动短期测试环境。
我怀疑大多数人实际上是这样做的。(我不知道。)但没有理由你不能。
对于它的价值,我以前从未听说过 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 的不同版本呢?
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
由于上面的所有答案都很老,我想在这里总结一下我的发现。在来自 rvm/ruby 之后,我试图弄清楚它是如何与 Python 一起工作的,但在网上的任何地方都找不到明确的解释。
所以我们在 Macos 上有以下选项:
自制软件(仅限 MacOS)
...可以安装python
和python3
。它们将存储在 Homebrew 的 Cellar 中,并从/usr/local/bin
. 截至目前,默认python
安装使用的是 2.7.6。brew
使用安装的软件包pip
将进入默认位置(您也有pip
和pip3
符号链接)。
Pyenv(Pythonbrew 的继承者)
...是 Homebrew(在 Macos 上)安装和维护多个 Python 版本的替代方法。Linux 没有 Homebrew,因此 Pyenv 是一种专门用于 Python 的版本。它还从源代码构建 Python。
Pyenv 保留了 python 安装,并允许在二进制文件(等)~/.pyenv/versions/
之间快速切换和使用相同的名称。它使用“shim”二进制文件,这些二进制文件是假的二进制文件,例如模仿 Python 的,而只是默默地将执行重定向到当前活动的版本。python
pip
python
pip
使用安装的包pip
将进入活动的 Python 安装。
因此,这些方法都不足以为每个项目维护单独的 python 安装和包版本集(就像 rvm 对 gemsets 所做的那样)。因此:
虚拟环境
...是最接近 rvm 的东西。引用这篇文章:
它通过从主要 Python 安装中复制或链接文件来创建新的 bin 和 lib 目录,从而在新目录中设置 Python 的干净副本
因此它使用Python 的当前活动副本并将其复制到单独的目录中。virtualenvwrapper
添加了管理这些环境的功能,并cd
像使用一样自动激活它们rvm
。
这允许隔离用于每个项目的 python 版本和安装的库。但是,它本身不会安装python
版本。
因此,听起来大多数人都使用pyenv
+virtualenv
或brew
+的组合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 为开发项目提供了一个隔离的环境——它将该项目的所有库保存在一个地方,并且它使重新定位(和部署)项目变得更加容易。