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


1017

Python 3.3在其标准库中包含了新软件包venv。它有什么作用?与似乎与regex匹配的所有其他软件包(py)?(v|virtual|pip)?env有何不同?


20
为了抢占票数,我觉得这是一个比stackoverflow.com/questions/29950300/…更为笼统的问题,因此我对编辑该问题或在该帖子上发布过于笼统的答案感到不满意。
Flimm

12
该指南既有用又不断更新,因为python继续添加越来越多的“一种和唯一一种明显的方法”来做事: docs.python-guide.org/en/latest/dev/virtualenvs
michael

2
从3.6版本开始,我发现与macOS上的pyenv(我是pyNoob)相比,virtualenv可以更轻松地工作
HashRocketSyntax

@HashRocketSyntax virtualenvpyenv不会执行相同的功能,并且不能互相替代。看我的答案。
Flimm '18

6
我用pipenv浪费了一整天。最重要的是,它已经被过度销售。如果需要py2,Venv和virtualenv是合适的工具。Conda(如果不需要完整堆栈,则为miniconda)也非常好。很好的书面记录:chriswarrick.com/blog/2018/07/17/...
SwimBikeRun

Answers:


1379

PyPI软件包不在标准库中:

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

    它的工作方式是在目录(例如:)中安装一堆文件env/,然后修改PATH环境变量以在其之前添加自定义bin目录(例如:)env/bin/。在完全相同的副本pythonpython3二进制文件放在这个目录中,但是Python编程寻找相对于其路径优先库,环境中的目录。它不是Python标准库的一部分,但是受到PyPA(Python包装管理局)的正式认可。激活后,您可以使用在虚拟环境中安装软件包pip

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

  • pyenv-virtualenv是一个插件pyenv由同一作者的pyenv,允许你使用pyenvvirtualenv在同一时间方便。但是,如果您使用的是Python 3.3或更高版本,请pyenv-virtualenv尝试运行python -m venv它(如果有),而不是virtualenv。如果您不希望使用便利功能,则可以在不使用的情况下一起使用virtualenv和。pyenvpyenv-virtualenv

  • virtualenvwrappervirtualenv(参见docs)的一组扩展。它为您提供诸如mkvirtualenv,的命令,lssitepackages尤其是workon在不同virtualenv目录之间切换时。如果您需要多个virtualenv目录,此工具特别有用。

  • pyenv-virtualenvwrapperpyenv与作者相同的插件pyenv,可以方便地集成virtualenvwrapperpyenv

  • pipenv旨在结合Pipfilepipvirtualenv为在命令行一个命令。该virtualenv目录通常放置在中~/.local/share/virtualenvs/XXXXXX是项目目录路径的哈希值。这与不同virtualenv,后者的目录通常位于当前工作目录中。pipenv是指在开发Python应用程序(而不是库)时使用。还有的替代品pipenv,例如poetry,我将不在此处列出,因为该问题仅与名称相似的软件包有关。

标准库:

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

  • venv是Python 3附带的软件包,您可以使用它运行python3 -m venv(尽管出于某些原因,某些发行版将其分成了单独的发行版软件包,例如python3-venv在Ubuntu / Debian上)。它的作用与相同virtualenv,但仅具有部分功能(请参见此处的比较)。virtualenv继续比受欢迎venv,尤其是因为前者同时支持Python 2和3。

给初学者的建议:

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


115
这非常有帮助!那么为什么会有8个纠结的东西而不是1个呢?(“应该有一种-最好只有一种-明显的方式来做到这一点。”-Python的禅宗)
Jerry101 '17

59
@ Jerry101,venv的引入部分是对这种混乱的回应。如果您想帮助改善这种情况,建议您使用venv并鼓励其他人也这样做。
马格纳斯·林德·奥克斯隆德(Marnus Lind Oxlund)

31
“引入venv一定程度上是对这种混乱的一种反应。”当有太多事情像“ X”时,人们总是认为他们可以通过制造另一种可以实现“ X象”的东西来改善这种混乱。 。实际上有点好笑。我们现在已经过去了4年...所以可能有个问题要问,venv实际上解决了这个问题吗?
克里斯(Kris)

34
列表中仅有的两个真正涵盖了相同领域的工具是virtualenv和venv,因此我们要处理由多个竞争工具引起的混乱的特征不是很精确。但是,该列表确实包含几个与虚拟环境相关的工具,所有工具名称相似。这可能会造成混淆,尤其是对于刚刚了解它们的用户而言。venv改善了情况吗?得益于本机修改和标准库中的位置,它确实提供了比其他虚拟环境工具更轻巧的替代方案。…
马格纳斯·林德·奥克斯隆德

11
@cowbert从Python 3.5升级到Python 3.6之后,我所有的virtualenvs都中断了,看起来venv您可以更轻松地升级到新的Python版本。
丹尼尔·H

275

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

$ python3 -m venv <MYVENV>  

virtualenv尝试将Python二进制文件复制到虚拟环境的bin目录中。但是,它不会更新嵌入到该二进制文件中的库文件链接,因此,如果您将Python从源代码构建到具有相对路径名的非系统目录中,则Python二进制文件会中断。由于这是使副本可分发的Python的方式,因此这是一个很大的缺陷。BTW使用来检查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是对建。

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

pyenv类似于venv,它可以让您管理多个python环境。但是,pyenv由于无法方便地将库安装回滚到某些开始状态,因此您admin有时可能需要特权来更新库。所以我认为也最好使用venv

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


3
add2virtualenvPYTHONPATH通过_virtualenv_path_extensions.pth在下添加自定义文件来调整您的内容site-packages。或者,您可以PYTHONPATHbin/activate每次激活虚拟环境时在调用的文件中更新环境变量。或者,您可以在下面添加符号链接site-packages以指向额外的目录。这两种选择对开发人员广泛用于进行故障排除的传统命令行工具都更加透明。使用.pth带有未记录名称的自定义名称,使IMO看起来更加神奇。
Riaz Rizvi '18年

15
好的,我已经在stackoverflow.com/questions/48130371/…上确认,正确的更新可以PYTHONPATH消除对的需要add2virtualenv。关于您的第一个评论中对SO的帮助不足,我的唯一建议是,如果他们解决了您的问题,请否决答案,以激励人们在您发帖时为您解决问题?半小时的调查和写作以换取鼠标单击?听起来像是一笔不错的交易……
Riaz Rizvi '18年

7
不,您说的没错-我会努力提高投票权。哎呀,如果你在我附近,我会给你买啤酒。我会信守诺言,看看python doc伙计们是否允许我将更改添加到/ bin / activate官方文档中,以使内容更加清晰。尽管我不是很好,但是我对python并不感到恐惧。如果对我来说很难...总之,谢谢您的时间-祝您一切顺利。
SteveJ '18年

9
@ MalikA.Rumi的祝福已被略微简化为“ Pipenv创作者努力地向我们和其他人推销产品,这就是我们提到Pipenv的原因”。
罗布·格兰特

6
@AndreaMoro pyvenv不赞成使用,而不是pyenv。容易混淆这些工具的名称。
Daniel Holmes

24

我掉进了pipenv兔子洞(的确是个黑洞和黑洞……),因为最后一个答案是两年多以前的,所以觉得有必要用有关Python虚拟信封主题的最新进展来更新讨论非常有用。找到了。

免责声明:

这个答案是不是对继续有关的优点的激烈争论pipenv VENV如信封解决方案- 我并没有任代言。这是关于PyPA赞同冲突的标准,以及如何未来发展的virtualenv承诺否定制造要么/或它们之间选择的话。我专注于这两个工具正是因为它们是PyPA的受膏工具。

静脉

如OP所述,venv是用于虚拟化环境的工具。不是第三方解决方案,而是本机工具。PyPA认可venv用于创建虚拟信封:“ 在3.5版中进行了更改:现在建议使用venv创建虚拟环境 ”。

吹牛

pipenv- venv-可以用于创建虚拟信封,但是还可以引入包管理和漏洞检查功能。通过使用 Pipfile交付软件包管理requirements.txt,而不是使用。当 PyPA认可pipenv用于包管理时,这似乎意味着取代了。pipenvpipfilerequirements.txt

但是pipenv使用virtualenv作为创建虚拟信封的工具,而不是 venvPyPA认可它为创建虚拟信封的必备工具。

标准冲突:

因此,如果解决虚拟信封解决方案还不够困难,那么我们现在让PyPA认可使用不同虚拟信封解决方案的两个不同工具。Github关于venv vs virtualenv的激烈辩论可以在这里找到该冲突的重点。

解决冲突:

上面链接中提到的Github辩论已经引导了virtualenv的开发,以适应将来的发行版中venv发展

首选内置venv:如果目标python拥有venv,我们将使用该环境创建环境(然后对其进行后续操作以促进我们提供的其他保证)

结论:

因此,看起来这两个相互竞争的虚拟信封解决方案之间将会有一些未来的融合,但是截至目前,pipenv(使用的)virtualenv与有所不同venv

鉴于pipenv解决的问题以及PyPA给予的祝福,它似乎拥有光明的前景。而且,如果virtualenv实现了其建议的开发目标,那么选择pipenvvenv不再是选择虚拟信封解决方案的理由


5
据我了解:Pipenv的实际价值已经争论了一段时间,并且在一年多的时间里还没有发布。从那时起,许多事情发生了变化,我认为对于Pipenv来说情况只会变得更糟(诗歌pip工具等工具的状态要好得多)。该PyPA页面已经过时了,我认为他们应该降级pipenvvenv是标准工具,因此非常高效,但功能有限。virtualenv不会与venv竞争,而是尝试覆盖venv不能或不想去的地区(因为这是一个标准)。
sinoroc

@sinoroc我的帖子不是关于优点或pipenv的,而是关于PyPA支持pipenv venv 的相互矛盾的指导,这使得信封解决方案的选择更加困难,并且看起来如何某种程度的融合会否定选择的需要他们之间。请注意,我什么都不认可,只是分享我所学到的关于PyPA认可的这两种解决方案正在发展的知识。鉴于PyPA对它们的兴趣,无论我是否喜欢它们都变得无关紧要:pipenv和venv似乎有可能成为风光的一部分
F1Linux

8
我会说尽可能坚持venvpip。这两个都保留了下来,venv是Python标准库的一部分,从某种意义上来说也是点子,因为它是用Python提供的(通过surepip)。其他工具(不包括pyenv系列:完全不同)完全依赖venvpip或模仿venvpip(或多或少成功)。太好了 但是,如果事情变得肮脏,venvpip是安全的后备。我使用的唯一其他工具是tox(使用tox-venv),以帮助创建和填充虚拟环境(简单​​明了,没有魔力,奇怪的是尚未提及)。
sinoroc

2
最新的帖子是黄金,因为它在消除皱纹方面做得很好。我坚持使用pip和venv,因为在升级系统python时使用virtualenv悬挂二进制文件时遇到了问题。
codeviper

1
在过去,我遇到了关于pipenv错误的问题。argl和沟。另外:chriswarrick.com/blog/2018/07/17/...
qrtLs

2

2020年4月更新

当我看到这篇文章时,我正在寻找相同的内容。我认为对于像我这样的新Python用户而言,使用什么工具这个问题非常令人困惑和困难。这直接来自PyPA网站上关于pipenv的信息:

虽然本教程将pipenv项目作为工具主要集中在Python应用程序开发而不是Python库开发上,但该项目本身目前正在解决多个流程和维护问题,这些问题阻止了bug修复和新功能的发布(整个2019年过去了,而没有新版本)。这意味着,在短期内,pipenv仍然会遇到一些怪癖和性能问题,而没有明确解决这些问题的时间表。

尽管情况仍然如此,但项目维护人员可能希望研究其他用于应用程序依赖性管理的工具,以代替pipenv或与之一起使用。

假设2020年4月发布的pipenv按计划进行,此后的发布也仍在进行中,那么该教程中的警告将被删除。如果这些发行版不符合要求,那么教程本身将被删除,并替换为可用的依赖项管理选项上的讨论页。


看起来pipenv当前(即2020年5月)仍在2020年4月版的预发布中。看这里
andrewjames

这不能回答问题。
Flimm

我认为@Flimm很好地回答了这些问题。我是在回应F1Linux的答复
Arnuld
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.