python 3.3在其标准库中包含了新的包venv。它是做什么的,它与所有其他似乎与regex (py)?(v|virtual|pip)?env匹配的包有什么不同?
- 为了先发制人,我觉得这是一个比stackoverflow.com/questions/29950300/…更普遍的问题,所以我不愿意编辑这个问题或在那篇文章上发表过于笼统的答案。
- 随着python继续添加更多"一种&唯一一种显而易见的方式"来完成任务,本指南非常有用并且不断更新:docs.python-guide.org/en/latest/dev/virtualenvs
- 从3.6开始,我发现与MacOS上的pyenv相比,virtualenv更容易工作(我是pynoob)
- @hashrocketsyntax virtualenv和pyenv不具有相同的功能,也不能互相替代。看看我的答案。
型不在标准库中的PYPI包:
百万千克1
virtualenv是一个非常流行的工具,它为Python库创建独立的Python环境。如果您不熟悉这个工具,我强烈建议您学习它,因为它是一个非常有用的工具,我将在这个答案的其余部分与它进行比较。好的。型
它的工作原理是在一个目录中安装一组文件(例如:env/),然后修改PATH环境变量,使其前缀为自定义bin目录(例如:env/bin/)。python或python3二进制文件的精确副本放在这个目录中,但是python被编程为首先在环境目录中查找与其路径相关的库。它不是Python标准库的一部分,而是由Pypa(Python打包机构)正式祝福的。激活后,可以使用pip在虚拟环境中安装包。好的。型百万千克1百万千克1
pyenv用于隔离python版本。例如,您可能想用python 2.6、2.7、3.3、3.4和3.5测试代码,因此您需要一种在它们之间切换的方法。激活后,它会在PATH环境变量前面加上~/.pyenv/shims,其中有与python命令匹配的特殊文件(python,pip)。这些不是python附带的命令的副本;它们是一些特殊的脚本,可以根据PYENV_VERSION环境变量、.python-version文件或~/.pyenv/version文件动态决定要运行的python版本。使用命令pyenv install,pyenv还可以简化下载和安装多个Python版本的过程。好的。型百万千克1百万千克1
pyenv-virtualenv是pyenv的插件,与pyenv的作者相同,可以方便地同时使用pyenv和virtualenv。但是,如果您使用的是python 3.3或更高版本,如果有可用的话,pyenv-virtualenv将尝试运行python -m venv,而不是virtualenv。如果您不想使用方便的功能,可以不使用pyenv-virtualenv,同时使用virtualenv和pyenv。好的。型百万千克1百万千克1
virtualenvwrapper是对virtualenv的一组扩展(见文档)。它提供诸如mkvirtualenv、lssitepackages等命令,特别是workon用于在不同的virtualenv目录之间切换。如果需要多个virtualenv目录,此工具尤其有用。好的。型百万千克1百万千克1
pyenv-virtualenvwrapper是pyenv的一个插件,作者与pyenv相同,方便地将virtualenvwrapper集成到pyenv中。好的。型百万千克1百万千克1
pipenv,作者Kenneth Reitz(requests的作者),是该清单中最新的项目。它的目标是将Pipfile、pip和virtualenv合并为命令行上的一个命令。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集成pip、virtualenv甚至pyenv。这里唯一真正可以互相替代的工具是venv和virtualenv。好的。初学者推荐:
这是我对初学者的个人建议:首先学习virtualenv和pip,这些工具可以在各种情况下与python 2和3一起使用,一旦你开始需要它们,就拿起其他工具。好的。好啊。
- 我喜欢别人回答我不知道的问题。
- 这很有帮助!那么为什么有8个缠结的东西而不是1个呢?("应该有一种——最好只有一种——显而易见的方法。"——Python的禅)
- @有时不需要未知的未知数。
- @Jerry101,引入Venv在一定程度上是对混乱局面的回应。如果你想帮助改善情况,我建议你使用Venv并鼓励其他人也这样做。
- "Venv的引入在某种程度上是对这种混乱的回应"为什么当有太多的事情做"像x这样的事情"时,人们总是认为他们可以通过做另一件事来改善这种混乱,就像x这样的事情。实际上有点滑稽。我们现在4年后…所以,也许有必要问一下,venv真的解决了这个问题吗?
- 列表中唯一两个真正涵盖可以说是同一领域的工具是virtualenv和venv,因此我们处理由几个竞争工具造成的混乱的特征并不是很精确。然而,该列表确实由几个与虚拟环境相关的工具组成,所有这些工具都有相似的发音名称。这可能会让人困惑,尤其是对于刚刚了解它们的用户而言。维诺夫改善了情况吗?它确实提供了一个比其他虚拟环境工具更轻的选择,受益于本机修改和标准库中的一个位置。…
- 通常情况下,在市场上拥有一个优越的选择权并不能保证它的统治地位。在python 2到3迁移过程中,用户习惯和跨版本支持等因素会减慢任何可能采用venv作为标准的速度。通过实现一个标准来清除工具箱需要时间,如果不鼓励和支持这种转换,则只需要更长的时间。
- 这些都不适用于LD_LIBRARY_PATH的怪异,或者如果PATH已经被说成是modules所吞噬。除了硬连接和堆芯捆绑之外,还有一个合理的理由认为venv比virtualenv更好吗?
- 好的,但是在创建virtualenv(使用--python参数)和在python版本中创建virtualenv之间的区别是什么?
- pipenv是否仍如答案所述进行实验?或者是在答案发布后发生了变化。Github上Pipenv的自述文件声明"可供生产使用"
- pipenv现在在python.org的Installing and using packages部分进行了推广。
- 除了Pypi的链接pipenv,还有官方文档。而且,是的,这个名单不断增长,真是讽刺/有趣/悲伤。"应该有一种——最好只有一种——显而易见的方法来做到这一点。"这是一个残酷的笑话。我猜"Python禅"意味着重复的轮回……也许我们应该看到这一点——Python不断地重新发明轮子(双关语),包装也不例外。
- @Themefield谢谢。我已经编辑了答案,删除了关于PipeNV的"可能是实验性的"评论。
- pipenv应该移动到列表中的第一个项目。
- @Cobbert刚从python 3.5升级到python 3.6,我所有的virtualenvs都中断了,看起来像是venv让您更容易升级到新的python版本。
- pip和pipenv的有用指南,以及virtualenv部分:docs.python-guide.org/en/latest/dev/virtualenvs
- 所以,由于答案的综合性,为什么不加上你的两分钱,关于康达创造的环境?老实说,我想知道你的想法。
- 考虑使用Docker。
- pyenv允许您通过执行pyenv update从pyenv repo下载更改来进行升级。然后,pyenv install and just pyenv uninstall`和pyenv virtualenv 创建垫片。再简单不过了。
- 您可能需要考虑将py.exe添加到这个列表中,这个列表是Windows启动程序,允许您选择Python版本。请参阅docs.python.org/3/using/…。
- 为什么每次有人写关于Pipenv的东西时,都会特别提到作者Kenneth Reitz,当提到所有其他工具时,作者并没有被提到或简单地称为"作者"?
- @托比,我不能告诉你为什么其他人会提到他的名字。我在pipenv旁边提到了他的名字,因为他的名字与requests有着显著的联系,我想激励那些已经使用过和喜欢requests的人去看看pipenv。除此之外我什么都没有,我请求你不要把这变成一场火焰战。
- @ Flimm谢谢。我不想发动火焰战。今天我才第二次被这样提到的他的名字绊倒,我想知道为什么。
- 如果您无法在Ubuntu 18.04下安装,将中断pip("importerror:cannot import name main"),这是一个循序渐进的教程,我遵循了它,它对我有效。
我只会避免在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) |
因此,我将避免使用virtualenvwrapper和pipenv。不推荐使用pyvenv。pyenv似乎经常在使用virtualenv的地方使用,但我也会远离它,因为我认为venv也做了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将是一个更好的平台。
- 但是,venv似乎缺少基本元素(例如类似于add2virtualenv),这使得导入管理很麻烦。而且,祝你好运,试着帮我用上它。我试着换上了维诺夫,这太痛苦了,我要换回去了。
- add2virtualenv通过在site-packages下添加自定义_virtualenv_path_extensions.pth文件来调整PYTHONPATH。或者,您可以更新bin/activate文件中的PYTHONPATH环境变量,每次激活虚拟环境时都调用该变量。或者您可以在site-packages下添加符号链接,以指向额外的目录。对于开发人员广泛用于故障排除的传统命令行工具来说,这两种方法都更加透明。在我看来,使用一个没有正式名称的自定义.pth会使它看起来更神奇。
- 尝试在垃圾箱中添加pythonpath/activate——运气不好;可以尝试其他人——谢谢您的建议。问题是,我已经通读了所有的文件,却找不到任何内容。我张贴了,所以没人能帮忙。这很容易变成一个讨论(我认为这是一个很好的讨论),但就目前而言——我建议将venv用于一般用途的问题是,对于我们来说,仅仅是Python凡人,如果没有一个与venvwrapper相当的工具,它似乎还没有准备好迎接黄金时期。我可以很容易地告诉某人键入"add2virtualenv",将其发送到站点包,而不是太多。
- 编辑PYTHONPATH必须有效,请参阅stackoverflow.com/questions/4757178/&hellip;。如果您遇到问题,请在那里发表评论,我将为您排查故障。PYTHONPATH采用父文件夹的路径,而不是模块本身。如果您遇到stackoverflow.com/questions/19917492/how-to-use-pythonpath(或手册),请参阅此问题!docs.python.org/3/using/cmdline.html envvar pythonpath)
- 请参阅;stackoverflow.com/questions/48130371/&hellip;--我已经尝试了我能想到的所有pythonpath变体。如果你能帮我找到方法,我会主动修改python的官方文档:)
- 好吧,我已经在stackoverflow.com/questions/48130371/&hellip;上确认了对PYTHONPATH的正确更新可以消除对add2virtualenv的需要。关于从你的第一条评论中缺乏帮助,我唯一的建议是,如果他们解决了你的问题,我会投票给他们,鼓励他们在你发帖时帮你解决问题?半个小时的调查+写下来换取鼠标点击?听起来生意不错…
- 不,你说得对——我努力提高投票率。嘿,如果你在我的地盘,我会给你买一瓶啤酒。我会遵守我的承诺,看看python文档人员是否会允许我将更改添加到/bin/激活官方文档中,以使其更清晰。虽然我不太好,但我对Python不太在行。如果对我来说很难…不管怎样,谢谢你抽出时间-祝你一切顺利。
- @我喜欢你的方法。但是,当我在使用brew switch python <...>的版本之间切换时,激活的venv环境将返回与python --version不同的版本。我做错了什么?
- 我认为您应该使用明确的python版本创建venvs,不要使用BREW的缩写符号链接。因此,运行"brew info python"查找所有未符号链接的python二进制文件。然后使用版本化的python位置创建venv,例如'/usr/local/cell/python/3.7.0/bin/python'(或任何地方)。您将以通常的方式激活/停用venv,这只需要了解venv项目的bin目录。您不需要记住用哪个Python版本创建了venv项目。不过,我不熟悉这个问题,因为我不使用"BREW开关"
- "…因此,我将避免virtualenwrapper和pipenv。……。展望未来,读者需要意识到Pipenv现在已经被Python神正式祝福了。(pipenv,现在是python.org中python社区的官方推荐打包工具。kennethreitz.org/散文/pipenv-one-year-later-a-call-for-hel&zwnj;&8203;p)
- @马利卡。鲁米,祝福已经稍微减少到"Pipenv的创造者勤奋地向我们和其他人推销,这就是为什么我们提到Pipenv"。
- 请注意,Red Hat已经完全从RHEL8中删除了python-virtualenv(access.red hat.com/documentation/en-us/red-hat-enterprise-li&zwnj;&8203;nux/&hellip;)
- @尼莫,很高兴知道。谢谢。
- 对此不确定,但pyenv似乎不受欢迎。我错过什么了吗?github.com/pyenv/pyenv/blob/master/changelog.md(注1)