我刚接触Python,计划学习Django。之前略有Ruby(不是Rails)的经验,并了解RVM。然而,我不明白pythonbrew和virtualenv之间的区别。我知道pythonbrew是RVM的模拟版本,但我想virtualenv已经实现了RVM的功能(或者反过来说,pythonbrew已经实现了RVM的功能)。请问有人可以解释一下并提供一些具体的例子/用法来帮助我理解吗?非常感谢!
我刚接触Python,计划学习Django。之前略有Ruby(不是Rails)的经验,并了解RVM。然而,我不明白pythonbrew和virtualenv之间的区别。我知道pythonbrew是RVM的模拟版本,但我想virtualenv已经实现了RVM的功能(或者反过来说,pythonbrew已经实现了RVM的功能)。请问有人可以解释一下并提供一些具体的例子/用法来帮助我理解吗?非常感谢!
Pythonbrew类似于Ruby的rvm:它是一个shell函数,允许你:
您构建的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环境真的很快。
实际上,您可以将它们结合使用。下面是一个您可能想要这样做的情况:
就我所知,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呢?
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
~/.pyenv/versions/
中,并允许快速切换和使用相同的二进制文件名称(如python
,pip
等)。它使用"shim"二进制文件,这些假二进制文件像python
,pip
等一样模仿Python,而实际上只是静默重定向执行到当前活动版本。
使用pip
安装的软件包将进入活动的Python安装中。
因此,这两种方法都不足以维护每个项目的单独Python安装和软件包版本集(就像rvm对gemsets的处理方式)。因此:
...是最接近rvm的东西。引用this post的话:
所以它使用 Python 的当前活动副本并将其复制到单独的目录中。 virtualenvwrapper 添加了管理这些环境并像 rvm 一样使用 cd 自动激活它们的功能。它通过从主Python安装中复制或链接文件来创建新的bin和lib目录,在新目录中设置干净的Python副本
"pythonbrew is a program to automate the building and installation
of Python in the users $HOME."