venv、pyvenv、pyenv、虚拟环境、虚拟包装器、pipenv等之间有什么区别?

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

494102 次浏览

这是我对初学者的个人建议:从学习#0#1开始,这些工具适用于Python 2和3以及各种情况,并在您开始需要它们时选择其他工具。

现在我们来回答这个问题:venv、Virtualenv等这些名字相似的东西之间有什么区别?

不在标准库中的PyPI包:

  • #0是一个非常流行的工具,它为Python库创建隔离的Python环境。如果你不熟悉这个工具,我强烈建议学习它,因为它是一个非常有用的工具。

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

  • PATH0用于隔离Python版本。例如,您可能想要针对Python 2.7、3.6、3.7和3.8测试您的代码,因此您需要一种在它们之间切换的方法。一旦激活,它将PATH环境变量以~/.pyenv/shims为前缀,其中有与Python命令(pythonpip)匹配的特殊文件。这些不是Python附带命令的副本;它们是特殊脚本,根据PYENV_VERSION环境变量、.python-version文件或~/.pyenv/version文件动态决定运行哪个版本的Python。pyenv还使用命令pyenv install使下载和安装多个Python版本的过程更容易。

  • pyenv1是pyenv的一个插件,作者与pyenv相同,允许您方便地同时使用pyenvvirtualenv。但是,如果您使用的是Python 3.3或更高版本,如果可用,pyenv-virtualenv将尝试运行python -m venv,而不是virtualenv。如果您不想要方便的功能,您可以将virtualenvpyenv一起使用,而无需pyenv-virtualenv

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

  • #0pyenv的插件,作者与pyenv相同,方便地将virtualenvwrapper集成到pyenv中。

  • Pipfile1旨在将Pipfilepipvirtualenv组合成命令行上的一个命令。virtualenv目录通常放置在~/.local/share/virtualenvs/XXX中,XXX是项目目录路径的哈希值。这与virtualenv不同,后者的目录通常位于当前工作目录中。pipenv旨在开发Python应用程序(而不是库)时使用。还有pipenv的替代方案,例如Pipfile0,我不会在这里列出,因为这个问题仅涉及命名相似的包。

标准库:

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

  • #0是Python 3附带的一个包,您可以使用python3 -m venv运行它(尽管出于某种原因,一些发行版将其分离成一个单独的发行版包,例如Ubuntu/Debian上的python3-venv)。它的目的与virtualenv相同,但只有其功能的一部分(在这里看到一个比较)。virtualenv仍然比venv更受欢迎,特别是因为前者同时支持Python 2和3。

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

$ python3 -m venv <MYVENV>

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

$ otool -L bin/pythonpython:@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)

pyenv似乎经常在使用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将是一个更好的平台。

编辑:BDFL的推文,

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

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

更新20200825:

在下面添加“结论"段落

我已经进入了pipenv兔子洞(这是一个又深又黑的洞…)和因为上一次回答是2年前,觉得用我发现的Python虚拟信封主题的最新发展更新讨论很有用。

免责声明:

这个答案是不是,关于继续激烈的辩论,关于管道nv<作用力>ven v作为信封解决方案的优点-我对两者都不认可。这是关于Py PA支持相互冲突的标准,以及虚拟en v的未来发展如何承诺否定在它们之间做出<强>或者选择。我专注于这两个工具,正是因为它们是Py PA指定的工具。

venv

正如OP所指出的,<作用力>ven v是虚拟化环境的工具。<强>不是第三方解决方案,但本机工具。Py PA支持<作用力>ven v创建虚拟信封:“在3.5版更改:现在建议使用venv创建虚拟环境”。

pipenv

管道nv-像<作用力>ven v-可用于创建虚拟信封,但还可以引入包管理和漏洞检查功能。pipenv不是使用requirements.txt,而是通过Pipfile提供包管理。作为PyPA支持pipenv用于包管理,这似乎意味着pipfile将取代requirements.txt

然而管道nv使用虚拟en v作为创建虚拟信封的工具,不是<作用力>ven vPy PA认可为创建虚拟信封的首选工具。

标准冲突:

因此,如果确定虚拟信封解决方案还不够困难,我们现在有Py PA支持两个使用不同虚拟信封解决方案的不同工具。

冲突解决:

上面链接中引用的Github辩论将虚拟en v的开发引向了未来版本中的<作用力>ven v

更喜欢内置venv:如果目标python有venv,我们将创建使用该环境(然后对该环境执行后续操作)以方便我们提供的其他保证)

结论:

因此,看起来两个竞争对手的虚拟信封解决方案之间未来会有一些融合,但截至目前,使用virtualenv管道nvvenv有很大差异。

在进行本分析时,我经常看到对0的批评是它没有得到积极维护。事实上,使用一个由于缺乏持续开发而未来可能被视为可疑的解决方案有什么意义?在经历了大约18个月的枯竭期后,0再次被积极开发。事实上,此后发布进行了大规模的实质性更新。

2020年1月更新

@Flimm已经很好地解释了所有的区别。通常,我们想知道所有工具之间的区别,因为我们想决定什么对我们最好。因此,下一个问题将是:使用哪一种?我建议你选择两种官方管理虚拟环境的方式之一:

  • pyenv-管理不同的python版本,
  • 所有其他-创建虚拟环境(隔离了python)版本和安装的“要求”),

pipenv要合并所有,除了以前的它安装“需求”(到活动的虚拟环境或创建自己的如果没有活动)

所以也许你只对pipenv感到满意。

但我使用:pyenv+pyenv-Virtualenv包装器,+pipenv(pipenv仅用于安装需求)。

在Debian中:

  1. apt install libffi-dev

  2. 基于https://www.tecmint.com/pyenv-install-and-manage-multiple-python-versions-in-linux/安装pyenv,但是…

  3. …但不是pyenv-Virtualenv安装pyenv-Virtualenv包装器(可以是独立库或pyenv插件,这里是第二个选项):

    $ pyenv install 3.9.0
    $ git clone https://github.com/pyenv/pyenv-virtualenvwrapper.git $(pyenv root)/plugins/pyenv-virtualenvwrapper# inside ~/.bashrc add:# export $VIRTUALENVWRAPPER_PYTHON="/usr/bin/python3"$ source ~/.bashrc
    $ pyenv virtualenvwrapper

然后为您的项目创建虚拟环境(workingdir必须存在):

pyenv local 3.9.0  # to prevent 'interpreter not found' in mkvirtualenvpython -m pip install --upgrade pip setuptools wheelmkvirtualenv <venvname> -p python3.9 -a <workingdir>

并在项目之间切换:

workon <venvname>python -m pip install --upgrade pip setuptools wheel pipenv

在一个项目中,我有文件requirements.txt,没有修复里面的版本(如果一些版本限制是不必要的)。您有两种可能的工具将它们安装到当前的虚拟环境中:pip工具pipenv。假设您将使用pipenv:

pipenv install -r requirements.txt

这将创建Pipfile和Pipfile.lock文件,固定版本在第二个。如果你想重新安装完全相同的版本,然后(Pipfile.lock必须存在):

pipenv install

请记住,Pipfile.lock与某些Python版本相关,如果您使用不同的版本,则需要重新创建。

如你所见,我写requirements.txt.这有一些问题:你也必须从Pipfile中删除一个已删除的包。所以直接编写Pipfile可能更好。

所以你可以看到我用pipenv很差。也许如果你用得好,它可以取代一切?

编辑2021.01:我已经将我的堆栈更改为:pyenv + pyenv-virtualenvwrapper + poetry。即。我不使用apt或pip安装虚拟环境或虚拟环境包装器,而是安装pyenv的插件pyenv-virtualenvwrapper。这是更简单的方法。

Poetry对我来说很棒:

poetry add <package>   # install single packagepoetry remove <package>poetry install   # if you remove poetry.lock poetry will re-calculate versions

让我们从这些工具想要解决的问题开始:

我的系统包管理器没有我想要的Python版本,或者我想并排安装多个Python版本,Python 3.9.0和Python 3.9.1,Python 3.5.3等

然后使用pyenv。

我想安装和运行具有不同、冲突依赖项的多个应用程序。

这些几乎是完全可以互换的,不同之处在于虚拟环境支持较旧的python版本,并且有一些次要的独特功能,而venv在标准库中。

我正在开发一个 /application/需要管理我的依赖项,并管理我的项目的依赖项的依赖解决方案。

然后用pipenv或诗歌。

我正在开发 /library/或 /package/,并希望指定我的库用户需要安装的依赖项

然后使用setupols。

我使用了虚拟环境,但我不喜欢虚拟环境文件夹分散在各种项目文件夹中。我想要集中管理环境和一些简单的项目管理

如果您也使用pyenv,则使用虚拟包装器。变体:pyenv-虚拟包装器。


不推荐

  • pyvenv。这是不建议使用的,改用venv或Virtualenv。不要与pipenv或pyenv混淆。

作为一个Python新手,这个问题让我无休止地感到沮丧,并让我困惑了几个月。当我知道我将在未来几年使用它时,我应该投资学习哪个虚拟环境和包管理器?

回答这个棘手问题的最佳文章是Jake Vanderplas的https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/。虽然只有几年的历史,但它提供了实用的答案以及Python包和虚拟环境管理器的历史,这些都是最先进的开发。

在数据科学和“大数据云计算”社区中,这对我来说尤其令人沮丧,因为conda被广泛用作Python和JavaScript、SQL、Java、HTML5和Jupyter Notebook的虚拟环境管理器和全功能包管理器。

那么,当conda做了pip和venv变体所做的一切时,为什么还要使用pip呢?

答案是,“因为如果conda包根本不可用,你必须使用pip。”很多时候,所需的包只能以pip格式提供,并且没有简单的解决方案只能使用pip。你可以学习使用conda build,但如果你不是包维护者,那么你必须说服包所有者为每个新版本生成一个conda包(或自己做)。

这些基于pip的软件包在许多重要和实用的方面有所不同:

  • 稳定性
  • 成熟
  • 复杂性
  • 积极支持(相对于死亡或死亡)
  • Python生态系统“核心”附近的采用水平与“Fringes"(即集成到Python.org发行版中)
  • 易于理解和使用(适合初学者)

我将从包的成熟度和稳定性两个维度来回答你的问题。

venv和Virtualenv是最成熟、最稳定和社区支持的。从在线留档中,您可以看到Virtualenv目前的版本为20. x。虚拟环境

Virtualenv是一个创建隔离Python环境的工具。由于Python 3.3,它的一个子集已集成到标准中venv模块下的库。venv模块不提供所有这个库的功能,仅举几个更突出的例子:

is slower (by not having the app-data seed method),
is not as extendable,
cannot create virtual environments for arbitrarily installed python versions (and automatically discover these),
is not upgrade-able via pip,
does not have as rich programmatic API (describe virtual environments without creating them).

虚拟包装器是一组帮助人们使用虚拟包装器的脚本(它是一个维护不善的“包装器”,它的最后一次更新是在2019年。虚拟环境包装器

我的建议是尽可能避免所有pip虚拟环境,使用conda代替。conda提供了一个统一的方法。它由专业的开源开发团队维护,并有一家声誉良好的公司提供资金和商业支持的版本。维护pip、venv、虚拟环境、pipenv和许多其他pip变体的团队相比之下资源有限。pip虚拟环境的多样性让初学者感到沮丧。基于pip的虚拟环境工具复杂性、碎片化、边缘和不支持的包,以及极其不一致的支持驱使我使用conda。对于数据科学工作,我的建议是,当conda包不存在时,使用基于pip的虚拟环境管理器作为最后的手段。

venv变体之间的差异仍然让我感到害怕,因为我的时间有限,无法学习新程序包。pipenv、venv、pyvenv、pyenv、虚拟环境、虚拟环境包装器、诗歌和其他有几十个差异和复杂性,需要几天才能理解。我讨厌走一条路,当维护人员辞职(或太忙而无法维护它)时,找到对包的支持就会失败。我只需要完成我的工作。

本着乐于助人的精神,这里有一些链接可以帮助您深入了解,但不会迷失在但丁的地狱(re: pip)中。

Python虚拟环境指南

选择“核心”Python包为你的职业生涯(长期)投资,而不是短期完成工作)很重要。然而,这是一个商业分析问题。你是想简单地完成一项任务,还是一个专业的软件工程师构建可扩展的性能系统,随着时间的推移需要最少的维护工作量?恕我直言,conda会比处理pip-多个问题更容易带你到后一个地方。许多Python程序员要么懒得创建conda包,要么他们只用Python编程,不需要conda的语言无关/多语言支持。

Conda对我来说是天赐之物,因为它支持云软件工程和数据科学对JavaScript、SQL和Jupyter Notebook扩展的多语言支持的需求,并且conda在Docker和其他云原生环境中运行良好。我鼓励你学习和掌握conda,这将使你能够回避许多基于pip的工具可能永远无法回答的复杂问题。

保持简单!我需要一个包,可以完成我需要的90%,并为剩余的10%边缘情况提供指导和解决方法。

查看此处链接的文章,了解有关基于pip的虚拟环境的更多信息。

我希望这对原始海报有帮助,并给pip和conda爱好者一些思考的事情。