virtualenv 和 pyenv 是什么关系?

What is the relationship between virtualenv and pyenv?

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

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

  • Pyenv 是一个 bash 扩展 - 无法在 Windows 上运行 - 拦截你对 python 的调用、pip 等,将它们定向到几个系统 python 工具链之一。因此,您始终可以使用所选 python 版本中安装的所有库 - 因此,这对于必须在 python.

    [= 的不同版本之间切换的用户来说非常有用53=]
  • 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 直接使用它,或者您可以在 windows 上使用优秀的 py python 选择器和 py -3 -m venv desired/env/path。它将创建用 desired/env/path 配置指定的目录并适当地填充它。一般来说,它非常像使用 VirtualEnv。

其他工具

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

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

简短版本:

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

更长的版本:

Virtualenv 允许您创建自定义 Python 安装,例如在您的项目的子目录中。这是通过从系统某处现有的 Python 安装克隆来完成的(一些文件被复制,一些是 reused/shared 以保存 space)。因此,您的每个项目都可以在各自的 virtualenv 下拥有自己的 python(甚至多个)。 some/all virtualenvs 甚至拥有相同版本的 python(例如 3.8.5)而没有冲突是完全没问题的——它们分开生活并且彼此不了解。如果你想使用 shell 中的任何 python,你必须 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 使用。