我最近学会了如何在我的工作流程中使用virtualenv和virtualenvwrapper,但我在一些指南中看到了pyenv,但我似乎无法理解pyenv是什么以及它是如何不同的/类似于virtualenv。 pyenv是virtualenv或免费工具的更好/更新的替代品吗?如果后者有什么不同的做法,那么两者(以及virtualenvwrapper,如果适用)如何协同工作?
答案 0 :(得分:144)
Pyenv 和 virtualenv 是非常不同的工具,可以通过不同方式执行不同的操作:
Pyenv 是一个bash扩展 - 在Windows上不起作用 - 拦截你对python,pip等的调用,将它们引导到几个系统python工具之一 - 链。因此,您始终可以在所选的python版本中安装所有已安装的库 - 因此对于必须在不同版本的python之间切换的用户来说是好的。
VirtualEnv ,是纯python,所以无处不在,它可以复制,可选的特定版本, python和pip本地激活环境可能包含也可能不包含指向当前系统工具链的链接,如果不包含,则只能在该环境中安装已知的库子集。因此,对于测试和部署来说几乎肯定会好得多,因为您知道完全哪些库使用哪个版本,全局更改不会影响您的模块。
请注意,从Python 3.3开始,有一个名为venv的VirtualEnv的内置实现(在某些安装中,有一个名为pyvenv的包装器 - 这个包装器是deprecated in Python 3.6),应该可以优先使用它。为了避免包装器可能出现问题,通常可以使用/path/to/python3 -m venv desired/env/path
直接使用它,或者在py
的窗口上使用优秀的py -3 -m venv desired/env/path
python选择器。它将创建使用desired/env/path
configure指定的目录并正确填充它。一般来说,它非常像使用VirtualEnv。
有许多工具值得一提,并考虑到,因为它们可以帮助使用上述一个或多个:
答案 1 :(得分:11)
virtualenv
允许您创建自定义Python安装,例如在项目的子目录中。因此,您的每个项目都可以在各自的virtualenv下拥有自己的python
(甚至几个)。对于某些/所有虚拟媒体而言,即使拥有相同版本的python
(例如2.7.16)而没有冲突也是完全正常的 - 他们分开居住并且彼此不了解。如果你想使用python
中的任何一个,你必须activate
它(通过运行一个脚本,它会暂时修改你的PATH
以确保那个virtualenv' s {{ 1}}目录首先出现)。从那时起,调用bin/
(或python
等)会调用virtualenv的版本,直到你pip
(恢复deactivate
)。
PATH
的运行范围比pyenv
更广泛 - 它包含Python安装的注册表(可用于安装新的安装),并允许您配置在运行时运行的Python版本使用virtualenv
命令。听起来相似但实际使用有点不同。它的工作原理是将其垫片python
脚本添加到python
(永久),然后决定哪个"真实" PATH
要调用。你甚至可以配置pyenv调用你的一个virtualenv pythons(使用python
插件)。使用pyenv-virtualenv
安装的Python版本会进入其pyenv
目录(默认情况下,pyenv root是〜/ .pyenv),因此更多全局'比virtualenv。通常,您无法复制通过$(pyenv root)/versions/
安装的Python版本,至少这样做不是主要想法。
要创建具有特定Python版本的virtualenv,您需要在系统中的某个位置拥有该版本(无论它是否在pyenv
上),并且基本上将其克隆到新创建的virtualenv中。当然,获取特定版本的一种方法是通过PATH
安装它。完成后,各个虚拟虚拟机可以通过安装不同的模块(或其版本)而自由发散。
简而言之:
pyenv
允许您创建本地的独立python
通过现有克隆进行安装virtualenv
允许你这样做
同时安装不同版本的python(或者
系统范围或只为本地用户)然后选择其中的哪一个
在任何给定时间运行的众多蟒蛇(包括那些
由virtualenv或Anaconda创建)