venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、pipenv 等有什么区别?

新手上路,请多包涵

Python 3.3 在其标准库中包含新包 venv 。它有什么作用,它与匹配正则表达式 (py)?(v|virtual|pip)?env 的所有其他软件包有何不同?

原文由 Flimm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 916
2 个回答

这是我对初学者的个人建议: 首先学习 virtualenvpip ,适用于 Python 2 和 3 以及各种情况的工具,一旦你学会了其他工具开始需要它们。

现在回答这个问题:这些类似命名的事物之间有什么区别:venv、virtualenv 等?

PyPI 包不在标准库中:

  • virtualenv 是一个非常流行的工具,可以为 Python 库创建独立的 Python 环境。如果您不熟悉此工具,我强烈建议您学习它,因为它是一个非常有用的工具。

它的工作原理是在一个目录中安装一堆文件(例如: env/ ),然后修改 PATH 环境变量以在其前面加上自定义的 bin 目录(例如: env/bin/ )。 pythonpython3 二进制文件的精确副本放置在此目录中,但 Python 被编程为首先在环境目录中查找与其路径相关的库。它不是 Python 标准库的一部分,但得到了 PyPA(Python Packaging Authority)的正式祝福。激活后,您可以使用 pip 在虚拟环境中安装软件包。

  • pyenv 用于隔离Python版本。例如,您可能希望针对 Python 2.7、3.6、3.7 和 3.8 测试您的代码,因此您需要一种在它们之间切换的方法。 Once activated, it prefixes the PATH environment variable with ~/.pyenv/shims , where there are special files matching the Python commands ( python , pip ) .这些不是 Python 提供的命令的副本;它们是特殊脚本,可根据 PYENV_VERSION 环境变量或 .python-version 文件或 ~/.pyenv/version 文件即时决定运行哪个版本的 Python。 pyenv 使用命令 pyenv install --- 也使下载和安装多个 Python 版本的过程更容易。

  • pyenv-virtualenv is a plugin for pyenv by the same author as pyenv , to allow you to use pyenv and virtualenv 同时方便。但是,如果您使用的是 Python 3.3 或更高版本,则 pyenv-virtualenv 将尝试运行 python -m venv 如果可用,而不是 virtualenv 。如果您不想要便利功能,您可以在不使用 pyenv-virtualenv 的情况下一起使用 virtualenvpyenv

  • virtualenvwrappervirtualenv 的一组扩展(参见 文档)。它为您提供 mkvirtualenvlssitepackages 等命令,尤其是 workon virtualenv 目录之间切换如果您需要多个 virtualenv 目录,此工具特别有用。

  • pyenv-virtualenvwrapper is a plugin for pyenv by the same author as pyenv , to conveniently integrate virtualenvwrapper into pyenv .

  • pipenv aims to combine Pipfile , pip and virtualenv into one command on the command-line. virtualenv 目录通常放在 ~/.local/share/virtualenvs/XXX 中,其中 XXX 是项目目录路径的哈希值。这与 virtualenv 不同,后者的目录通常位于当前工作目录中。 pipenv 用于开发 Python 应用程序(而不是库)。有 pipenv 的替代品,例如 poetry ,我不会在这里列出,因为这个问题只是关于名称相似的包。

标准库:

  • pyvenv (不要与上一节中的 pyenv 混淆)是 Python 3.3 到 3.7 附带的脚本。它 从 Python 3.8 中删除,因为它有问题(更不用说令人困惑的名称)。运行 python3 -m venvpyvenv 效果完全相同。

  • venv 是 Python 3 附带的一个包,您可以使用 python3 -m venv 运行它(尽管由于某些原因,一些发行版将其分离到一个单独的发行版包中,例如 python3-venv 在 Ubuntu/Debian 上)。它的用途与 virtualenv 相同,但只有一部分功能( 参见此处的比较)。 virtualenv 继续比 venv 更受欢迎,特别是因为前者同时支持 Python 2 和 3。

原文由 Flimm 发布,翻译遵循 CC BY-SA 4.0 许可协议

我只是避免在 Python3.3+ 之后使用 virtualenv 而是使用标准的交付库 venv 。要创建一个新的虚拟环境,您可以键入:

 $ python3 -m venv <MYVENV>

virtualenv 尝试将 Python 二进制文件复制到虚拟环境的 bin 目录中。但是它不会更新嵌入到该二进制文件中的库文件链接,因此如果您将 Python 从源代码构建到具有相对路径名的非系统目录中,则 Python 二进制文件会中断。由于这是制作可分发 Python 副本的方式,因此这是一个很大的缺陷。顺便说一句,要检查 OS X 上的嵌入式库文件链接,请使用 otool 。例如,在您的虚拟环境中,键入:

 $ otool -L bin/python
python:
    @executable_path/../Python (compatibility version 3.4.0, current version 3.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

因此我会避免 virtualenvwrapperpipenvpyvenv 已弃用。 pyenv seems to be used often where virtualenv is used but I would stay away from it also since I think venv also does what pyenv 是为。

venv 在 shell 中创建 全新沙盒 虚拟环境,具有 用户可安装的库,并且它是 多 python 安全 的。

新鲜:因为虚拟环境仅从 python 附带的标准库开始,所以您必须在虚拟环境处于活动状态时使用 pip install 重新安装任何其他库。

沙盒 化:因为这些新库安装在虚拟环境之外都不可见,所以您可以删除整个环境并重新开始,而不必担心影响您的基本 python 安装。

用户可安装的库:因为虚拟环境的目标文件夹是在您已经拥有的某个目录中没有 sudo 的情况下创建的,所以您不需要 sudo 权限来将库安装到其中。

多 python 安全:因为当虚拟环境激活时,shell 只会看到用于构建该虚拟环境的 python 版本(3.4、3.5 等)。

pyenv 类似于 venv 因为它允许您管理多个 python 环境。但是,使用 pyenv 你不能方便地将库安装回滚到某个启动状态,你可能需要 admin 某些时候更新库的权限。所以我认为最好也使用 venv

在过去的几年里,我在构建系统(emacs 包、python 独立应用程序构建器、安装程序…)中发现了很多问题,这些问题最终归结为 virtualenv 的问题。我认为当我们消除这个附加选项并且只使用 venv 时,python 将是一个更好的平台。

编辑:BDFL 的推文,

我使用 venv(在 stdlib 中)和一堆 shell 别名来快速切换。

- Guido van Rossum (@gvanrossum) 2020 年 10 月 22 日

原文由 Riaz Rizvi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题