Python 3.3在其标准库中包含了新的软件包venv。它做什么,它与所有其他匹配regex(py)的包有何不同?(v|virtual|pip)?环境?
当前回答
作为一个Python新手,这个问题让我沮丧不已,困惑了好几个月。当我知道我将在未来几年使用虚拟环境和软件包管理器时,我应该在学习中投资哪些虚拟环境和程序包管理器?
回答这个棘手问题的最佳文章是https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/杰克·范德普拉斯。虽然已经有几年的历史,但它提供了实用的答案,以及Python包和虚拟环境管理器的历史,因为这些最先进的软件正在开发中。
在数据科学和“大数据云计算”社区,这对我来说尤其令人沮丧,因为conda被广泛用作Python和JavaScript、SQL、Java、HTML5和Jupyter笔记本的虚拟环境管理器和全功能包管理器。
那么,当conda完成了pip和venv变体的所有功能时,为什么还要使用pip呢?
答案是,“因为如果conda包根本不可用,您必须使用pip。”很多时候,所需的包只能以pip格式提供,除了使用pip之外,没有简单的解决方案。您可以学习使用conda构建,但如果您不是包维护者,那么您必须说服包所有者为每个新版本生成一个conda包(或者自己动手)
这些基于pip的软件包在许多重要和实用的方面有所不同:
稳定性成熟复杂性积极支持(对死亡或死亡)Python生态系统“核心”与“边缘”(即,集成到Python.org发行版中)易于理解和使用(适用于初学者)
我将从软件包成熟度和稳定性的角度回答您关于两个软件包的问题。
venv和virtualenv是最成熟、稳定和社区支持的。从在线文档中可以看到,截至目前,virtualenv的版本为20.x。虚拟的
virtualenv是一个创建独立Python环境的工具。自从Python 3.3,它的一个子集已集成到标准中venv模块下的库。venv模块不提供所有功能该库的功能,仅举几个更突出的功能:速度较慢(通过不使用应用数据种子方法),不可延伸,无法为任意安装的python版本创建虚拟环境(并自动发现这些),不能通过pip升级,没有丰富的编程API(描述虚拟环境而不创建它们)。
virtualenvwrapper是一套帮助人们使用virtualenv的脚本(它是一个维护不好的“包装器”,上一次更新是在2019年)。虚拟说唱歌手
我的建议是尽可能避免所有pip虚拟环境。改用conda。Conda提供了一种统一的方法。它由专业开源开发者团队维护,并有一家声誉良好的公司提供资金和商业支持版本。相比之下,维护pip、venv、virtualenv、pipenv和许多其他pip变体的团队资源有限。pip虚拟环境的多样性对于初学者来说是令人沮丧的。基于pip的虚拟环境工具的复杂性、碎片化、边缘化和不受支持的包,以及极不一致的支持,驱使我使用conda。对于数据科学工作,我的建议是,当conda包不存在时,使用基于pip的虚拟环境管理器作为最后的手段。
venv变体之间的差异仍然让我感到害怕,因为我学习新软件包的时间有限。pipenv、venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、poetry和其他人有许多不同之处和复杂性,需要几天才能理解。我讨厌走上一条路,当维护人员辞职(或太忙而无法维护)时,为软件包找到支持。我只需要完成我的工作。
本着乐于助人的精神,这里有几个链接可以帮助你深入了解,但不要迷失在但丁的《地狱》(re:pip)中。
Python虚拟环境指南
选择“核心”Python包来投资于你的职业(长期),而不是短期内完成工作,这一点很重要。然而,这是一个商业分析问题。你是想简单地完成一项任务,还是想找一个专业的软件工程师来构建一个可扩展的高性能系统,并且随着时间的推移需要最少的维护工作量?我的天,conda将带你去后一个地方比处理pip复数问题更容易。conda仍然缺少一步pip包迁移工具,这使得这成为一个悬而未决的问题。如果我们可以简单地将pip包转换为conda包,那么pypi.org和conda forge可以合并。Pip是必要的,因为conda包还没有普及。许多Python程序员要么懒得创建conda包,要么他们只使用Python编程,不需要conda的语言不可知/多语言支持。
conda对我来说是一个天赐良机,因为它支持云软件工程和数据科学对JavaScript、SQL和Jupyter Notebook扩展的多语言支持,并且conda在Docker和其他云原生环境中运行良好。我鼓励您学习并掌握conda,这将使您能够回避许多基于pip的工具可能永远无法回答的复杂问题。
保持简单!我需要一个能满足我90%需求的软件包,并为剩下的10%的边缘案例提供指导和解决方案。
查看此处链接的文章,了解有关基于pip的虚拟环境的更多信息。
我希望这对原始海报有帮助,并给琵琶和康达爱好者一些思考的东西。
其他回答
让我们从这些工具要解决的问题开始:
我的系统包管理器没有我想要的Python版本,或者我想并排安装多个Python版本,Python 3.9.0、Python 3.9.1、Python 3.5.3等
然后使用pyenv。
我想安装和运行多个具有不同、冲突依赖关系的应用程序。
然后使用virtualenv或venv。这些几乎是完全可互换的,不同的是,virtualenv支持较旧的python版本,并具有一些较小的独特功能,而venv在标准库中。
我正在开发一个/application/,需要管理我的依赖关系,并管理项目依赖关系的依赖关系解析。
然后使用pipenv或诗歌。
我正在开发/library/或/package/,并希望指定库用户需要安装的依赖项
然后使用setuptools。
我使用了virtualenv,但我不喜欢virtualenv文件夹分散在各个项目文件夹中。我想要集中管理环境和一些简单的项目管理
然后使用virtualvwrapper。变体:pyenv virtualenvwrapper,如果您也使用pyenv。
不推荐使用
皮文夫。这是不推荐的,请改用venv或virtualenv。不要与pipenv或pyenv混淆。
更新20200825:
在以下“结论”段落中添加
我去过pipenv兔子洞(这确实是一个又深又暗的洞……),由于上一个答案是两年前的事,我觉得用我发现的Python虚拟信封主题的最新发展来更新讨论是很有用的。
免责声明:
这个答案并不是要继续关于pipenv和venv作为包络解决方案的优点的激烈辩论,我也不赞成。这是关于PyPA认可相互冲突的标准,以及virtualenv的未来发展将如何否定在两者之间做出非此即彼的选择。我专注于这两个工具,正是因为它们是PyPA的受膏工具。
venv
正如OP所指出的,venv是一种虚拟化环境的工具。不是第三方解决方案,而是本地工具。PyPA支持venv创建虚拟环境:“在3.5版中进行了更改:现在建议使用venv来创建虚拟环境”。
管道女
pipenv(类似于venv)可以用于创建虚拟信封,但还可以添加包管理和漏洞检查功能。pipenv通过Pipfile提供包管理,而不是使用requirements.txt。由于PyPA认可pipenv用于包管理,这似乎意味着pipfile将取代requirements.txt。
然而:pipenv使用virtualenv作为创建虚拟信封的工具,而不是由PyPA认可的venv作为创建虚拟封套的工具。
冲突标准:
因此,如果确定虚拟信封解决方案还不够困难,我们现在让PyPA认可两种不同的工具,它们使用不同的虚拟信封解决。Github关于venv vs virtualenv的激烈辩论突显了这一冲突,这一点可以在这里找到。
冲突解决:
上述链接中提到的Github辩论将virtualenv开发引向了在未来版本中适应venv的方向:
首选内置venv:如果目标python具有venv,我们将创建环境(然后对其执行后续操作以促进我们提供的其他担保)
结论:
因此,这两个竞争对手的虚拟信封解决方案之间似乎会有一些未来的融合,但到目前为止,使用virtualenv的pipenv与venv有很大的不同。
考虑到pipenv解决的问题以及PyPA给予的祝福,它似乎有一个光明的未来。如果virtualenv实现了其提出的开发目标,那么选择虚拟信封解决方案就不再是pipenv或venv的问题。
更新20200825:
我在进行这项分析时看到,对Pipenv的一个经常重复的批评是它没有得到积极维护。事实上,使用一个因缺乏持续发展而前途堪忧的解决方案有什么意义?在经历了大约18个月的干旱期后,Pipenv再次被积极开发。事实上,此后发布了大量重要更新。
作为一个Python新手,这个问题让我沮丧不已,困惑了好几个月。当我知道我将在未来几年使用虚拟环境和软件包管理器时,我应该在学习中投资哪些虚拟环境和程序包管理器?
回答这个棘手问题的最佳文章是https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/杰克·范德普拉斯。虽然已经有几年的历史,但它提供了实用的答案,以及Python包和虚拟环境管理器的历史,因为这些最先进的软件正在开发中。
在数据科学和“大数据云计算”社区,这对我来说尤其令人沮丧,因为conda被广泛用作Python和JavaScript、SQL、Java、HTML5和Jupyter笔记本的虚拟环境管理器和全功能包管理器。
那么,当conda完成了pip和venv变体的所有功能时,为什么还要使用pip呢?
答案是,“因为如果conda包根本不可用,您必须使用pip。”很多时候,所需的包只能以pip格式提供,除了使用pip之外,没有简单的解决方案。您可以学习使用conda构建,但如果您不是包维护者,那么您必须说服包所有者为每个新版本生成一个conda包(或者自己动手)
这些基于pip的软件包在许多重要和实用的方面有所不同:
稳定性成熟复杂性积极支持(对死亡或死亡)Python生态系统“核心”与“边缘”(即,集成到Python.org发行版中)易于理解和使用(适用于初学者)
我将从软件包成熟度和稳定性的角度回答您关于两个软件包的问题。
venv和virtualenv是最成熟、稳定和社区支持的。从在线文档中可以看到,截至目前,virtualenv的版本为20.x。虚拟的
virtualenv是一个创建独立Python环境的工具。自从Python 3.3,它的一个子集已集成到标准中venv模块下的库。venv模块不提供所有功能该库的功能,仅举几个更突出的功能:速度较慢(通过不使用应用数据种子方法),不可延伸,无法为任意安装的python版本创建虚拟环境(并自动发现这些),不能通过pip升级,没有丰富的编程API(描述虚拟环境而不创建它们)。
virtualenvwrapper是一套帮助人们使用virtualenv的脚本(它是一个维护不好的“包装器”,上一次更新是在2019年)。虚拟说唱歌手
我的建议是尽可能避免所有pip虚拟环境。改用conda。Conda提供了一种统一的方法。它由专业开源开发者团队维护,并有一家声誉良好的公司提供资金和商业支持版本。相比之下,维护pip、venv、virtualenv、pipenv和许多其他pip变体的团队资源有限。pip虚拟环境的多样性对于初学者来说是令人沮丧的。基于pip的虚拟环境工具的复杂性、碎片化、边缘化和不受支持的包,以及极不一致的支持,驱使我使用conda。对于数据科学工作,我的建议是,当conda包不存在时,使用基于pip的虚拟环境管理器作为最后的手段。
venv变体之间的差异仍然让我感到害怕,因为我学习新软件包的时间有限。pipenv、venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、poetry和其他人有许多不同之处和复杂性,需要几天才能理解。我讨厌走上一条路,当维护人员辞职(或太忙而无法维护)时,为软件包找到支持。我只需要完成我的工作。
本着乐于助人的精神,这里有几个链接可以帮助你深入了解,但不要迷失在但丁的《地狱》(re:pip)中。
Python虚拟环境指南
选择“核心”Python包来投资于你的职业(长期),而不是短期内完成工作,这一点很重要。然而,这是一个商业分析问题。你是想简单地完成一项任务,还是想找一个专业的软件工程师来构建一个可扩展的高性能系统,并且随着时间的推移需要最少的维护工作量?我的天,conda将带你去后一个地方比处理pip复数问题更容易。conda仍然缺少一步pip包迁移工具,这使得这成为一个悬而未决的问题。如果我们可以简单地将pip包转换为conda包,那么pypi.org和conda forge可以合并。Pip是必要的,因为conda包还没有普及。许多Python程序员要么懒得创建conda包,要么他们只使用Python编程,不需要conda的语言不可知/多语言支持。
conda对我来说是一个天赐良机,因为它支持云软件工程和数据科学对JavaScript、SQL和Jupyter Notebook扩展的多语言支持,并且conda在Docker和其他云原生环境中运行良好。我鼓励您学习并掌握conda,这将使您能够回避许多基于pip的工具可能永远无法回答的复杂问题。
保持简单!我需要一个能满足我90%需求的软件包,并为剩下的10%的边缘案例提供指导和解决方案。
查看此处链接的文章,了解有关基于pip的虚拟环境的更多信息。
我希望这对原始海报有帮助,并给琵琶和康达爱好者一些思考的东西。
我只是避免在Python3.3+之后使用virtualenv,而是使用标准的附带库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)
因此,我会避免虚拟rapper和pipenv。pyvenv已弃用。pyenv似乎经常在使用virtualenv的地方使用,但我也会远离它,因为我认为venv也做pyenv的构建目的。
venv在shell中创建了新的、沙盒化的虚拟环境,具有用户可安装的库,并且是多python安全的。
新鲜:因为虚拟环境仅从python附带的标准库开始,所以在虚拟环境处于活动状态时,您必须使用pipinstall重新安装任何其他库。
沙盒:因为这些新的库安装在虚拟环境之外都不可见,所以您可以删除整个环境并重新开始,而不用担心影响基本的python安装。
用户可安装的库:因为虚拟环境的目标文件夹是在您已经拥有的某个目录中创建的,不需要sudo权限即可将库安装到其中。
多python安全:因为当虚拟环境激活时,shell只能看到用于构建虚拟环境的python版本(3.4、3.5等)。
pyenv与venv相似,它允许您管理多个python环境。然而,使用pyenv,您无法方便地将库安装回滚到某个启动状态,而且您可能需要管理员权限才能更新库。所以我认为使用venv也是最好的。
在过去的几年中,我在构建系统(emacs包、python独立应用程序构建器、安装程序…)中发现了许多问题,最终归结为virtualenv的问题。我认为,当我们取消这个附加选项并只使用venv时,python将是一个更好的平台。
编辑:BDFL的推特,
我使用venv(在stdlib中)和一堆shell别名来快速切换。-Guido van Rossum(@gvanrossum)2020年10月22日
我想将docker添加到这个列表中,以及几个答案已经提到的conda。
conda比标题中提到的虚拟环境更重。它还隔离了一些系统python工具,如ffmpeg或gpu驱动程序。
docker甚至更好,它为您提供了一个全新的操作系统。有了一个好的Dockerfile和一个docker构建、docker运行脚本,您就可以很好地记录环境是如何构建的,并且很容易填充、迁移到其他环境(登台、生产、云)。从长远来看,它会帮助你。
另一件事:PyCharm提供了几个选项来选择您的虚拟环境。这有助于新来者不必担心这件事。建议在了解虚拟环境是什么之前使用它。
推荐文章
- 如何在Python中进行热编码?
- 如何嵌入HTML到IPython输出?
- 在Python生成器上使用“send”函数的目的是什么?
- 是否可以将已编译的.pyc文件反编译为.py文件?
- Django模型表单对象的自动创建日期
- 在Python中包装长行
- 如何计算两个时间串之间的时间间隔
- 我如何才能找到一个Python函数的参数的数量?
- 您可以使用生成器函数来做什么?
- 将Python诗歌与Docker集成
- 提取和保存视频帧
- 使用请求包时出现SSL InsecurePlatform错误
- 如何检索Pandas数据帧中的列数?
- except:和except的区别:
- 错误:“字典更新序列元素#0的长度为1;2是必需的”