virtualenv和pyenv是啥关系?

Posted

技术标签:

【中文标题】virtualenv和pyenv是啥关系?【英文标题】:What is the relationship between virtualenv and pyenv?virtualenv和pyenv是什么关系? 【发布时间】:2015-07-09 03:02:18 【问题描述】:

我最近学习了如何在我的工作流程中使用 virtualenv 和 virtualenvwrapper,但我在一些指南中看到了 pyenv,但我似乎无法理解 pyenv 是什么以及它与 virtualenv 的不同/相似之处。 pyenv 是 virtualenv 的更好/更新的替代品还是免费工具?如果后者有什么不同,两者(如果适用,还有 virtualenvwrapper)如何协同工作?

【问题讨论】:

fgimian.github.io/blog/2014/04/20/…: 但是,还有另一种称为 pyenv 的替代方案具有几个显着优势 不要像我一样把pyenvpyvenv混淆 【参考方案1】:

短版:

virtualenv 允许您通过从现有的克隆创建本地(每个目录)独立的 python 安装 pyenv 允许您同时安装(从源代码构建)不同版本的 Python;然后,您可以使用 virtualenv 克隆它们或使用 pyenv 来选择在任何给定时间运行哪一个

加长版:

Virtualenv 允许您创建自定义 Python 安装,例如在项目的子目录中。这是通过从系统某处的现有 Python 安装中克隆来完成的(一些文件被复制,一些被重用/共享以节省空间)。因此,您的每个项目都可以在各自的 virtualenv 下拥有自己的python(甚至多个)。一些/所有 virtualenvs 甚至拥有相同版本的python(例如 3.8.5)而没有冲突是非常好的——它们分开生活并且彼此不了解。如果你想使用 shell 中的任何 pythons,你必须 activate 它(通过运行一个脚本来临时修改你的 PATH 以确保 virtualenv 的 bin/ 目录首先出现)。从那时起,调用python(或pip等)将调用该virtualenv的版本,直到你deactivate它(恢复PATH)。也可以使用其绝对路径调用 virtualenv Python - 这可能很有用,例如从脚本调用 Python 时。

Pyenv 的运行规模比 virtualenv 更广。它用于安装(从源代码构建)任意版本的 Python(它包含可用版本的寄存器)。默认情况下,它们都在~/.pyenv 下并排安装,因此它们比virtualenv“更全球化”。然后,它允许您在使用 python 命令(不带 virtualenv)时配置要运行的 Python 版本。这可以在全局级别或单独在每个目录中完成(通过将.python-version 文件放在目录中)。这是通过将 pyenv 的 shim python 脚本添加到您的 PATH (永久地,与 virtualenv 中不同)然后决定调用哪个“真实”python 来完成的。您甚至可以将 pyenv 配置为调用您的 virtualenv pythons 之一(通过使用pyenv-virtualenv 插件)。您还可以复制 Python 版本(通过给它们不同的名称)并让它们分道扬镳。

使用 pyenv 可以方便地安装 Python 以供后续 virtualenv 使用。

【讨论】:

【参考方案2】:

Pyenvvirtualenv 是非常不同的工具,它们以不同的方式工作以做不同的事情:

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

VirtualEnv,是纯 python,因此可以在任何地方使用,它会复制,可选的特定版本, python 和 pip 本地到激活环境可能包含也可能不包含指向当前系统工具链的链接,如果不包含,您可以仅将已知的库子集安装到该环境中。因此,几乎可以肯定,它对于测试和部署要好得多,因为您确切地知道使用了哪些库、哪些版本,并且全局更改不会影响您的模块。

venv python > 3.3

请注意,从 Python 3.3 开始,有一个名为 venv 的 VirtualEnv 内置实现(在某些安装中,有一个名为 pyvenv 的包装器 - 这个包装器是 deprecated in Python 3.6),可能应该优先使用它。为了避免包装器可能出现的问题,最好直接使用/path/to/python3 -m venv desired/env/path 直接使用它,或者您可以在带有py -3 -m venv desired/env/path 的Windows 上使用出色的py python 选择器。它将创建使用desired/env/path configure 指定的目录并适当地填充它。总的来说,它非常类似于使用 VirtualEnv。

其他工具

有许多工具值得一提和考虑,因为它们可以帮助使用上述一种或多种工具:

VirtualEnvWrapper 管理和简化 VirtualEnv - 跨平台的使用和管理。 pyenv-virtualenv,由pyenv-installer安装,它提供了用于管理和连接 VirtualEnv 的 PyEnv 工具 - 有了它,您可以拥有一个包含多个版本的 python 并在每个版本中创建隔离环境的基本安装其中 - Linux/OS-X由 Johann Visagie 建议 PyInstaller 可以获取您的 python 代码,可能在 VirtualEnv 下开发和测试,并将其捆绑起来,以便它可以运行一个没有安装 您的版本 python 的平台 - 请注意,它不是交叉编译器,您将需要一个 Windows(虚拟)机器来构建 Windows 安装等,但即使您可以确定将安装 python 但不能确定 python 的版本和所有库将安装,它也可以很方便与您的代码兼容。

【讨论】:

可能值得一提的是 pyenv-virtualenv,一个 pyenv 插件,它允许 pyenv 和 virtualenv 无缝协同工作。如果你使用 pyenv-installer 安装了 pyenv,那么 pyenv-virtualenv 已经存在。 * github.com/yyuu/pyenv-virtualenv * github.com/yyuu/pyenv-installer venv 现在在标准库中怎么样? @Flimm:从 python 3.3 开始,venv 是标准库的一部分,应该使用它来代替 virtualenv,因为它通常被描述为“virtualenv 做得对”-reddit.com/r/learnpython/comments/4hsudz/pyvenv_vs_virtualenv pyenv-virtualenv 不是(或至少不再是)仅限 Linux。有一个自制软件包,可以在 MacOS 上轻松安装。 最近几天我们为 Windows 开发了 pyenv,名为pyenv-win。看看有没有帮助

以上是关于virtualenv和pyenv是啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

pyenv和virtualenv搭建python虚拟环境

pyenv、virtualenv、anaconda 有啥区别?

python pyenv与 pyenv-virtualenv配置

centos6 pyenv和virtualenv搭建python虚拟环境

Mac 下实现 pyenv/virtualenv 与 Anaconda 的兼容

markdown Python框架与pyenv和virtualenv / venv