我最近学习了如何在工作流程中使用virtualenv和virtualenvwrapper,但是我在一些指南中看到了pyenv,但是我似乎无法了解pyenv是什么以及它与virtualenv有何不同/相似。pyenv是virtualenv的更好/更新的替代品还是免费的工具?如果后者有什么不同之处,以及两者(以及适用的virtualenvwrapper)如何一起工作?
我最近学习了如何在工作流程中使用virtualenv和virtualenvwrapper,但是我在一些指南中看到了pyenv,但是我似乎无法了解pyenv是什么以及它与virtualenv有何不同/相似。pyenv是virtualenv的更好/更新的替代品还是免费的工具?如果后者有什么不同之处,以及两者(以及适用的virtualenvwrapper)如何一起工作?
Answers:
Pyenv和virtualenv是非常不同的工具,它们以不同的方式工作以执行不同的操作:
Pyenv是bash扩展- 不适用于Windows-会拦截您对python,pip等的调用,以将其定向到多个系统python工具链之一。因此,您始终具有在选定的python版本中安装的所有库,因此,这对于必须在不同版本的python之间进行切换的用户而言非常有用。
VirtualEnv是纯python,因此可在任何地方使用,它会在激活环境中本地复制python和pip 的副本,或者可选地复制特定版本,该环境可能包含也可能不包含指向当前系统工具链的链接,如果不能,则可以仅将已知的库子集安装到该环境中。这样一来,几乎可以肯定,对于测试和部署而言,要好得多,因为您确切知道使用了哪个库,使用了哪个版本,并且全局更改不会影响您的模块。
请注意,从Python 3.3开始,有一个名为venv的VirtualEnv内置实现(在某些安装中,有一个名为pyvenv的包装器- 在Python 3.6中已弃用该包装器),应该优先使用它。为避免包装程序可能出现问题,通常最好直接使用/path/to/python3 -m venv desired/env/path
或使用py
Windows上的优秀python选择器来使用它py -3 -m venv desired/env/path
。它将创建用desired/env/path
configure 指定的目录并适当地填充它。通常,这非常类似于使用VirtualEnv。
有许多值得一提和考虑的工具,因为它们可以帮助使用上述一种或多种:
venv
,现在在标准库?
virtualenv
允许您在项目的子目录中创建自定义Python安装。因此,您的每个项目python
在其各自的virtualenv下都可以拥有自己的(甚至几个)项目。某些/所有virtualenv甚至具有相同版本python
(例如2.7.16)而没有冲突是完全可以的-它们独立存在并且彼此不认识。如果要使用其中任何一个python
,则必须使用activate
它(通过运行一个脚本来临时修改您的脚本,PATH
以确保virtualenv的bin/
目录位于第一位)。从那时起,调用python
(或其他方法pip
)将调用该virtualenv的版本,直到您使用deactivate
它(还原PATH
)为止。
pyenv
它的运行范围比virtualenv
-拥有的Python安装寄存器(可用于安装新的),并允许您配置使用python
命令时运行哪个版本的Python 。听起来很相似,但实际用法却有所不同。它的工作方式是(永久地)python
在您的填充脚本之前添加PATH
(永久),然后确定python
要调用的“真实” 脚本。您甚至可以配置pyenv以调用您的virtualenv python之一(通过使用pyenv-virtualenv
插件)。使用pyenv
进行安装的Python版本进入其$(pyenv root)/versions/
目录(默认情况下pyenv根目录为〜/ .pyenv),因此比virtualenv更“全局”。通常,您不能复制通过安装的Python版本pyenv
,至少这样做不是主要思想。
要创建具有特定Python版本的virtualenv,您需要将该版本放置在系统中的某个位置(无论是否在该版本中PATH
),并将其本质上克隆到新创建的virtualenv中。当然,获得特定版本的一种方法是通过安装它pyenv
。完成此操作后,可以通过将不同的模块(或其版本)安装到各个虚拟环境中来自由进行区分。
简而言之:
virtualenv
允许您通过从现有安装中进行克隆来创建本地独立的python安装pyenv
允许您同时安装不同版本的python(在系统范围内或仅针对本地用户),然后选择在任意给定时间运行哪些python(包括由virtualenv或Anaconda创建的)