关于python:venv,pyvenv,pyenv,virtualenv,virtualenvwrapper,pipenv等有什么区别?

What is the difference between venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc?

python 3.3在其标准库中包含了新的包venv。它是做什么的,它与所有其他似乎与regex (py)?(v|virtual|pip)?env匹配的包有什么不同?


型不在标准库中的PYPI包:

    百万千克1

    virtualenv是一个非常流行的工具,它为Python库创建独立的Python环境。如果您不熟悉这个工具,我强烈建议您学习它,因为它是一个非常有用的工具,我将在这个答案的其余部分与它进行比较。好的。型

    它的工作原理是在一个目录中安装一组文件(例如:env/),然后修改PATH环境变量,使其前缀为自定义bin目录(例如:env/bin/)。pythonpython3二进制文件的精确副本放在这个目录中,但是python被编程为首先在环境目录中查找与其路径相关的库。它不是Python标准库的一部分,而是由Pypa(Python打包机构)正式祝福的。激活后,可以使用pip在虚拟环境中安装包。好的。型百万千克1百万千克1

    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 installpyenv还可以简化下载和安装多个Python版本的过程。好的。型百万千克1百万千克1

    pyenv-virtualenvpyenv的插件,与pyenv的作者相同,可以方便地同时使用pyenvvirtualenv。但是,如果您使用的是python 3.3或更高版本,如果有可用的话,pyenv-virtualenv将尝试运行python -m venv,而不是virtualenv。如果您不想使用方便的功能,可以不使用pyenv-virtualenv,同时使用virtualenvpyenv。好的。型百万千克1百万千克1

    virtualenvwrapper是对virtualenv的一组扩展(见文档)。它提供诸如mkvirtualenvlssitepackages等命令,特别是workon用于在不同的virtualenv目录之间切换。如果需要多个virtualenv目录,此工具尤其有用。好的。型百万千克1百万千克1

    pyenv-virtualenvwrapperpyenv的一个插件,作者与pyenv相同,方便地将virtualenvwrapper集成到pyenv中。好的。型百万千克1百万千克1

    pipenv,作者Kenneth Reitz(requests的作者),是该清单中最新的项目。它的目标是将Pipfilepipvirtualenv合并为命令行上的一个命令。virtualenv目录通常放在~/.local/share/virtualenvs/XXX中,XXX是项目目录路径的散列。这与virtualenv不同,后者的目录通常位于当前工作目录中。好的。

    python打包指南在开发时建议使用pipenv。python应用程序(与库相反)。似乎没有是否有计划支持venv,而不是virtualenv(15)。令人困惑的是,它的命令行选项--venv是指virtualenv目录,而不是venv目录,同样,环境变量PIPENV_VENV_IN_PROJECT影响virtualenv目录,不是venv目录(1919)。好的。

标准库:

  • pyvenv是随python 3一起提供的脚本,但在python3.6中已弃用,因为它存在问题(更不用说混淆的名称)。在python 3.6+中,确切的等价物是python3 -m venv。好的。

  • venv是随python 3一起提供的一个包,您可以使用python3 -m venv运行它(尽管出于某些原因,一些发行版将它分离成一个单独的发行版包,如ubuntu/debian上的python3-venv)。它的用途与virtualenv相似,工作方式也非常相似,但不需要复制周围的python二进制文件(在Windows上除外)。如果不需要支持python 2,可以使用这个。在撰写本文的时候,python社区似乎对virtualenv很满意,我还没有听到太多关于venv的讨论。好的。

这些工具中的大多数是相互补充的。例如,如果需要,pipenv集成pipvirtualenv甚至pyenv。这里唯一真正可以互相替代的工具是venvvirtualenv。好的。初学者推荐:

这是我对初学者的个人建议:首先学习virtualenvpip,这些工具可以在各种情况下与python 2和3一起使用,一旦你开始需要它们,就拿起其他工具。好的。好啊。


我只会避免在python3.3+之后使用virtualenv,而是使用标准的附带库venv。要创建新的虚拟环境,请键入:

1
$ python3 -m venv <MYVENV>

virtualenv试图将python二进制文件复制到虚拟环境的bin目录中。但是,它不会更新嵌入到该二进制文件中的库文件链接,因此,如果您从源代码将python构建到具有相对路径名的非系统目录中,则python二进制文件将中断。由于这是如何生成可分发拷贝的python,所以这是一个很大的缺陷。btw要检查OS X上的嵌入式库文件链接,请使用otool。例如,从虚拟环境中键入:

1
2
3
4
$ 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)

因此,我将避免使用virtualenvwrapperpipenv。不推荐使用pyvenvpyenv似乎经常在使用virtualenv的地方使用,但我也会远离它,因为我认为venv也做了pyenv的用途。

venv在shell中创建了全新的、沙盒化的虚拟环境,以及用户可安装的库,而且它是多python安全的。新鲜,因为虚拟环境只从与python一起提供的标准库开始,所以在虚拟环境处于活动状态时,您必须使用pip install重新安装所有其他库。沙盒,因为这些新的库安装在虚拟环境之外都不可见,所以您可以删除整个环境并重新启动,而不必担心影响基本的python安装。用户可安装的库,因为虚拟环境的目标文件夹是在您已经拥有的某个目录中创建的,而没有sudo,因此您不需要sudo权限即可将库安装到其中。最后,它是多python安全的,因为当虚拟环境激活时,shell只看到用于构建该虚拟环境的python版本(3.4、3.5等)。

pyenvvenv相似,因为它允许您管理多个Python环境。但是,使用pyenv时,您无法方便地将库安装回滚到某个启动状态,并且在某些时候可能需要admin特权来更新库。所以我认为最好还是使用venv

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