205

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

4

2 回答 2

189

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

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

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

venv python > 3.3

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

附加工具

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

  • VirtualEnvWrapper管理和简化 VirtualEnv- Cross Platform的使用和管理。
  • pyenv-virtualenvpyenv-installer 安装,它为管理和连接 VirtualEnv 提供了 PyEnv 工具 - 有了它,您可以拥有一个包含多个版本的 python 并在每个版本中创建隔离环境的基本安装 - Linux/OS-十约翰·维萨吉推荐
  • PyInstaller可以获取您的 python 代码,可能在 VirtualEnv 下开发和测试,并将其捆绑起来,以便它可以运行一个没有安装您的python 版本的平台 - 请注意,它不是一个交叉编译器,您需要一个 Windows(虚拟-)machine 来构建 Windows 安装等,但即使您可以确定将安装 python 但不能确定 python 的版本和所有库是否与您的代码兼容,它也可以很方便。
于 2015-04-29T17:30:11.473 回答
33

精简版:

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

更长的版本:

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

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

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

于 2017-09-21T12:32:14.913 回答