virtualenv和pyenv有什么关系?

我最近学会了如何在我的工作stream中使用virtualenv和virtualenvwrapper,但是我已经在一些指南中看到了pyenv,但似乎无法理解pyenv是什么以及它与virtualenv有什么不同。 pyenv是一个更好的/新的替代virtualenv或免费的工具? 如果后者有什么不同的做法,以及这两者(如果适用的话,包括virtualenvwrapper)是如何合作的?

Pyenvvirtualenv是非常不同的工具,它们以不同的方式来完成不同的事情:

  • Pyenv是一个bash扩展 – 在Windows上不起作用 – 拦截你对python,pip等的调用,将它们引导到几个系统python工具链之一。 因此,您始终可以使用选定的Python版本中安装的所有库,因此对于需要在不同版本的Python之间切换的用户来说,这是非常有用的。

  • VirtualEnv是纯Python,因此可以在任何地方工作,它会在激活环境中创build一个python和pip 的特定版本的拷贝(可能包含或不包含当前系统工具链的链接),如果它不能在该环境中只安装一个已知的库子集。 因此,对于testing和部署,几乎肯定会好得多,因为您确切知道哪些库在哪些版本中使用,并且全局更改不会影响您的模块。

venv python> 3.3

请注意,从Python 3.3开始,有一个名为venv的VirtualEnv的内置实现(在某些安装中,一个名为pyvenv的包装器 – 这个包装器在Python 3.6中被弃用 ),应该优先使用它。 为了避免包装可能出现的问题,通常使用/path/to/python3 -m venv desired/env/path直接使用它是个不错的主意,或者你可以在py -3 -m venv desired/env/path上使用优秀的py pythonselect器py -3 -m venv desired/env/path 。 它将创build指定的目录与desired/env/pathconfiguration并适当填充它。 一般来说,这非常像使用VirtualEnv。

其他工具

有一些值得一提的工具,并考虑到,因为他们可以帮助使用上面的一个或多个:

  • VirtualEnvWrapperpipe理和简化VirtualEnv – 跨平台的使用和pipe理。
  • pyenv-virtualenv , 由pyenv-installer安装 ,它提供了PyEnv工具来pipe理和连接到VirtualEnv – 你可以有一个基本的安装,包括多个版本的python,并在每个版本中创build独立的环境 – Linux / OS- X。 build议由约翰Visagie
  • PyInstaller可以把你的Python代码,可能开发和VirtualEnv下testing,并捆绑它,以便它可以运行一个平台,没有你的版本的 Python安装 – 注意,这不是一个交叉编译器,你将需要一个Windows(虚拟 – )机器来构buildWindows安装等,但即使在可以确定将安装python的情况下,它也可以很方便,但不能确定python的版本和所有的库将与您的代码兼容。

virtualenv允许你创build一个自定义的Python安装,例如在你的项目的子目录中。 因此,您的每个项目都可以在各自的virtualenv下拥有自己的python (甚至几个)。 对于某些/所有的virtualenvs而言,甚至是没有冲突的python版本(例如2.7.16)都是完全正确的 – 它们分开生活,彼此不知道。 如果你想使用这些python的任何一个,你必须activate它(通过运行一个脚本,它将临时修改你的PATH以确保该virtualenv的bin/目录第一)。 从这一点,调用python (或pip等)将调用该virtualenv的版本,直到你deactivate它(恢复PATH )。

pyenv运行范围比virtualenv更广泛 – 它拥有一个Python安装的registry(可以用来安装新的),并允许你configuration在使用python命令时运行哪个版本的Python。 听起来很相似,但实际使用有一点不同。 它的工作原理是将其shim python脚本预先添加到PATH (永久),然后决定调用哪个“真正的” python 。 你甚至可以configurationpyenv来调用你的一个virtualenv pyenv-virtualenv (通过使用pyenv-virtualenv插件)。 使用pyenv安装的Python版本进入它的$(pyenv root)/versions/目录(默认情况下,pyenv root是〜/ .pyenv),所以比virtualenv更“全局”。 通常情况下,你不能复制通过pyenv安装的Python版本,至less这样做不是主要的想法。

要使用特定的Python版本创buildvirtualenv,需要在系统中的某个位置(无论是否在PATH )使用该版本,并将其克隆到新创build的virtualenv中。 当然,获取特定版本的一种方法是通过pyenv来安装它。 一旦完成,个别的virtualenvs可以通过安装不同的模块(或其版本)来自由分离。

简而言之:

  • virtualenv允许您通过从现有的克隆中创build本地,独立的python安装
  • pyenv允许你同时安装不同版本的python(无论是系统范围内的还是本地用户),然后select在任何给定时间运行的python中的哪一个(包括由virtualenv或Anaconda创build的python)