我最近学习了如何在我的工作流程中使用虚拟环境和虚拟环境包装器,但我在一些指南中看到了pyenv,但我似乎无法理解pyenv是什么,以及它与虚拟环境有什么不同/相似之处。pyenv是一个更好/更新的虚拟环境的替代品还是一个免费的工具?如果是后者,它有什么不同之处,以及两者(如果适用,还有虚拟包装器)如何一起工作?
Pyenv和virtualenv是非常不同的工具,它们以不同的方式完成不同的任务:
>
Pyenv是一个bash扩展,在Windows上不起作用,它拦截您对python、pip等的调用,将它们指向几个系统python工具链中的一个。因此,在选定的python版本中安装的所有库都是可用的——因此,对于必须在不同版本的python之间切换的用户来说,这是很好的。
VirtualEnv,是纯粹的python,所以无处不在,它使一个副本,可选的特定版本,python和pip本地激活环境,可能包括或可能不包括链接到当前系统的工具链,如果它不,你可以安装一个已知的该环境中的库子集。因此,对于测试和部署来说,它几乎肯定要好得多,因为您确切地知道使用了哪些库、哪些版本,并且全局更改不会影响您的模块。
请注意,从Python 3.3开始,VirtualEnv有一个名为venv的内置实现(在一些安装中,有一个名为pyvenv的包装器——这个包装器在Python 3.6中不建议使用),它可能应该优先使用。为了避免包装器可能出现的问题,使用/path/to/python3-m venv期望的/env/path
直接使用它通常是一个好主意,或者您可以在带有py-3-m venv期望/env/path
.它将创建用指定的目录所需的/env/path
配置并适当填充它。一般来说,它非常像使用VirtualEnv。
有一些工具值得一提,并考虑,因为它们可以帮助使用上述一个或多个:
简短版本:
viralenv
允许您通过克隆现有的安装来创建本地(每个目录),独立的python安装pyenv
允许您安装(从源代码构建)不同版本的Python,然后您可以克隆它们与虚拟环境或使用pyenv选择哪一个在任何给定的时间运行较长的版本:
Virtualenv允许您创建自定义Python安装,例如在项目的子目录中。这是通过从系统上某个地方的现有Python安装进行克隆来完成的(一些文件被复制,一些文件被重用/共享以节省空间)。因此,您的每个项目都可以在各自的virtualenv下拥有自己的python
(甚至几个)。有些/所有VirtualNV甚至可以使用相同版本的python
(例如3.8.5)而不发生冲突,这是非常好的-他们分开生活,彼此不了解。如果您想使用shell中的任何python
s,您必须激活它(通过运行一个脚本,该脚本将临时修改您的
路径
,以确保virtualenv的bin/
目录首先出现)。从那时起,调用python
(或pip
等)将调用该virtualenv的版本,直到您停用它(这将恢复
路径
)。还可以使用virtualenv Python的绝对路径调用它——这非常有用,例如,当从脚本调用Python时。
Pyenv的运行规模比虚拟环境更广。它用于安装(从源代码构建)Python的任意版本(它保存可用版本的寄存器)。默认情况下,它们都在~/. pyenv
下并排安装,所以它们比虚拟环境“更全局”。然后,它允许您配置当您使用python
命令时运行哪个版本的Python(不需要虚拟环境)。这可以在全局级别上完成,也可以单独在每个目录下完成(通过在目录中放置一个. python-version
文件)。它是通过将pyenv的shimpython
脚本前置到您的PATH
(永久地,不像在虚拟环境中),然后由PATH决定调用哪个"real"python
来完成的。您甚至可以配置pyenv调用到您的虚拟环境蟒蛇之一(通过使用pyenv-虚拟环境
插件)。您还可以复制Python版本(通过给它们不同的名称),并让它们分开。
使用pyenv可以方便地安装Python以供后续virtualenv使用。