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

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

答案

PyPI 软件包不在标准库中:

  • virtualenv是一种非常流行的工具,可以为 Python 库创建隔离的 Python 环境。如果您不熟悉此工具,我强烈建议您学习它,因为它是非常有用的工具,在本答案的其余部分中,我将对其进行比较。

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

  • pyenv用于隔离 Python 版本。例如,您可能想针对 Python 2.6、2.7、3.3、3.4 和 3.5 测试代码,因此需要一种在它们之间切换的方法。激活后,它会在PATH环境变量前加上~/.pyenv/shims前缀,其中有匹配 Python 命令( pythonpip )的特殊文件。这些不是 Python 附带命令的副本。它们是特殊的脚本,它们根据PYENV_VERSION环境变量, .python-version文件或~/.pyenv/version文件,即时确定要运行哪个版本的 Python。 pyenv还可以使用pyenv install命令pyenv install下载和安装多个 Python 版本的过程。

  • pyenv-virtualenvpyenv的同一作者的pyenv ,可让您方便地同时使用pyenvvirtualenv 。但是,如果您使用的是 Python 3.3 或更高版本,则pyenv-virtualenv将尝试运行python -m venv如果可用),而不是virtualenv 。如果您不希望使用便捷功能,则可以将virtualenvpyenv一起使用,而无需使用pyenv-virtualenv

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

  • pyenv-virtualenvwrapperpyenv的同一作者的pyenv ,可方便地将virtualenvwrapper集成到pyenv

  • Kenneth Reitz( requests的作者)的pipenv是该列表中的最新项目。它旨在将Pipfilepipvirtualenv为命令行上的一个命令。通常将virtualenv目录放置在~/.local/share/virtualenvs/XXX ,其中XXX是项目目录路径的哈希。这与virtualenv不同,后者的目录通常位于当前工作目录中。

    《 Python 打包指南》 建议在开发 Python 应用程序(而不是库)时使用pipenv 。似乎没有任何计划支持venv而不是virtualenv#15 )。令人困惑的是,其命令行选项--venv是指virtualenv目录,而不是venv ,并且类似地,环境变量PIPENV_VENV_IN_PROJECT会影响virtualenv目录的位置,而不是venv目录( #1919 )。

标准库:

  • pyvenv是 Python 3 附带的脚本,但由于存在问题(更不用说混乱的名称了)而在 Python 3.6 中不推荐使用 。在 Python 3.6 + 中,确切的等效项是python3 -m venv

  • venv是 Python 3 随附的软件包,您可以使用python3 -m venv运行该python3 -m venv (尽管出于某些原因,某些发行版将其分成了单独的发行版软件包,例如 Ubuntu / Debian 上的python3-venv )。它的作用与virtualenv相似,并且工作方式非常相似,但是不需要复制 Python 二进制文件(Windows 除外)。如果您不需要支持 Python 2,请使用它。在撰写本文时,Python 社区似乎对virtualenv感到满意,并且我还没有听到太多有关venv

这些工具大多相互补充。例如,如果需要, pipenv集成了pipvirtualenv甚至pyenvvenvvirtualenv是彼此真正替代的唯一工具。

给初学者的建议:

这是我对初学者的个人建议:首先学习virtualenvpip ,这些工具在各种情况下virtualenv与 Python 2 和 3 一起使用,并在开始需要它们时选择其他工具。

我只是避免在 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似乎经常在使用virtualenv的地方使用,但由于我认为venv也会做pyenv ,因此我也不pyenv

venv使用用户可安装的库在外壳中创建全新的沙盒化的虚拟环境,并且它是多 Python 安全的新鲜 ,因为虚拟环境只能用标准库启动船舶与蟒蛇,你必须与各地重新安装任何其他库pip install在虚拟环境是积极的。 沙盒化是因为这些新库安装在虚拟环境之外都不可见,因此您可以删除整个环境并重新启动,而不必担心会影响基本的 python 安装。 用户可安装的库,因为在您已经拥有的某个目录中创建了虚拟环境的目标文件夹而没有sudo ,因此您不需要sudo权限即可将库安装到其中。最后,它是多 python 安全的 ,因为在激活虚拟环境时,shell 仅看到用于构建该虚拟环境的 python 版本(3.4、3.5 等)。

pyenv类似于venv ,它可以让你管理多个蟒蛇环境。但是,使用pyenv您无法方便地将库安装回滚到某些开始状态,并且在某些时候可能需要admin权限才能更新库。所以我认为最好还是使用venv

在过去的两年中,我发现了构建系统中的许多问题(emacs 软件包,python 独立应用程序构建器,安装程序...),最终归结为virtualenv问题。我认为当我们取消此附加选项并且仅使用venv时,python 将是一个更好的平台。