venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、pipenv 等之间有什么区别?
- 2024-12-11 08:47:00
- admin 原创
- 167
问题描述:
Python 3.3 在其标准库中包含了新包venv
。它有什么作用?它与所有其他匹配正则表达式的包有何不同(py)?(v|virtual|pip)?env
?
解决方案 1:
这是我对初学者的个人建议:virtualenv
从学习和开始pip
,这些工具可以在 Python 2 和 3 中以及在各种情况下使用,一旦开始需要其他工具,再学习它们。
现在来回答这个问题:这些类似名称的东西之间有什么区别:venv,virtualenv等?
标准库中没有的 PyPI 包:
virtualenv
是一款非常流行的工具,可以为 Python 库创建独立的 Python 环境。如果你不熟悉这个工具,我强烈建议你学习它,因为它是一款非常有用的工具。
它的工作原理是将一堆文件安装在一个目录中(例如env/
:),然后修改PATH
环境变量以在其前面加上自定义bin
目录(例如:)。或二进制文件env/bin/
的精确副本放在此目录中,但 Python 被编程为首先在环境目录中查找相对于其路径的库。 它不是 Python 标准库的一部分,但得到了 PyPA(Python 打包机构)的正式认可。 激活后,您可以使用在虚拟环境中安装软件包。python
`python3`pip
pyenv
用于隔离 Python 版本。例如,你可能想要针对 Python 2.7、3.6、3.7 和 3.8 测试你的代码,因此你需要一种在它们之间切换的方法。一旦激活,它会在PATH
环境变量中添加前缀,其中有与 Python 命令 ( , )~/.pyenv/shims
匹配的特殊文件。这些不是 Python 附带的命令的副本;它们是特殊的脚本,可根据环境变量、文件或文件动态决定运行哪个版本的 Python 。使用命令 还可以更轻松地下载和安装多个 Python 版本。python
`pipPYENV_VERSION
.python-version~/.pyenv/version
pyenv`pyenv install
pyenv-virtualenv
是 的插件,pyenv
由与 相同的作者开发pyenv
,可让您方便地同时使用pyenv
和virtualenv
。但是,如果您使用的是 Python 3.3 或更高版本,pyenv-virtualenv
则会尝试python -m venv
在可用时运行 ,而不是。如果您不想要这些便捷功能,virtualenv
则可以同时使用virtualenv
和,pyenv
而无需。pyenv-virtualenv
virtualenvwrapper
是一组扩展virtualenv
(请参阅文档)。它为您提供了诸如mkvirtualenv
、lssitepackages
和之类的命令,尤其是workon
用于在不同目录之间切换virtualenv
。如果您需要多个目录,此工具特别有用virtualenv
。pyenv-virtualenvwrapper
是 的插件,pyenv
由与 同一作者开发pyenv
,可以方便地集成virtualenvwrapper
到 中pyenv
。pipenv
旨在将Pipfile
、pip
和virtualenv
合并为命令行上的一个命令。virtualenv
目录通常放在 中~/.local/share/virtualenvs/XXX
,其中XXX
是项目目录路径的哈希值。这与 不同virtualenv
,其中目录通常位于当前工作目录中。pipenv
旨在用于开发 Python 应用程序(而不是库)。 还有其他替代方案pipenv
,例如poetry
,我不会在这里列出,因为这个问题只涉及名称相似的包。
标准库:
pyvenv
(不要与pyenv
上一节中的 混淆)是 Python 3.3 到 3.7 附带的脚本。由于存在问题(更不用说令人困惑的名称),它已从 Python 3.8 中删除python3 -m venv
。运行具有与 完全相同的效果pyvenv
。venv
是随 Python 3 附带的一个软件包,您可以使用它来运行python3 -m venv
(尽管出于某种原因,某些发行版会将其分离为单独的发行版包,例如python3-venv
在 Ubuntu/Debian 上)。它与 的用途相同virtualenv
,但仅具有其部分功能(请参阅此处的比较)。virtualenv
继续比 更受欢迎venv
,尤其是因为前者同时支持 Python 2 和 3。
解决方案 2:
在 Python3.3+ 之后,我会避免使用virtualenv
,而是使用标准库venv
。要创建新的虚拟环境,请键入:
$ python3 -m venv <MYVENV>
virtualenv
尝试将 Python 二进制文件复制到虚拟环境的 bin 目录中。但是,它不会更新嵌入到该二进制文件中的库文件链接,因此如果您将 Python 从源代码构建到具有相对路径名的非系统目录中,Python 二进制文件就会中断。由于这是制作可分发 Python 副本的方式,因此这是一个很大的缺陷。顺便说一句,要检查 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)
因此我会避免virtualenvwrapper
使用pipenv
。pyvenv
已被弃用。pyenv
似乎在经常virtualenv
使用的地方使用,但我也会远离它,因为我认为它venv
也做了pyenv
它的目的。
venv
在 shell 中创建全新的、沙盒化的虚拟环境,带有用户可安装的库,并且对多种 Python 都是安全的。
新鲜pip install
:因为虚拟环境仅从 python 附带的标准库开始,所以您必须在虚拟环境处于活动状态时重新安装任何其他库。
沙盒:因为这些新的库安装在虚拟环境之外都不可见,所以您可以删除整个环境并重新启动,而不必担心影响您的基本 python 安装。
用户可安装的库:因为虚拟环境的目标文件夹是sudo
在您已经拥有的某个目录中创建的,所以您不需要sudo
权限来将库安装到其中。
多 Python 安全:因为当虚拟环境激活时,shell 只能看到用于构建该虚拟环境的 Python 版本(3.4、3.5 等)。
pyenv
与 类似venv
,因为它允许您管理多个 Python 环境。但是,pyenv
您无法方便地将库安装回滚到某个起始状态,并且您可能需要admin
某些时候的权限才能更新库。所以我认为最好还是使用venv
。
在过去的几年中,我发现构建系统(emacs 包、python 独立应用程序构建器、安装程序……)中存在许多问题,这些问题最终都归结于 的问题virtualenv
。我认为,当我们消除这个附加选项并仅使用 时,python 将成为一个更好的平台venv
。
编辑:BDFL 的推文,
我使用 venv(在 stdlib 中)和一堆 shell 别名来快速切换。
— Guido van Rossum (@gvanrossum) 2020 年 10 月 22 日
解决方案 3:
更新2020-08-25:
在“结论”段落下方添加**
我已经进入了pipenv
兔子洞(这确实是一个很深很黑的洞......),而且由于上次回答已经是两年多前了,我觉得用我在 Python 虚拟信封主题上发现的最新进展来更新讨论是很有用的。
免责声明:
这个答案并不是要继续激烈争论pipenv 和 venv作为信封解决方案的优点——我不认可其中任何一个。这是关于PyPA认可相互冲突的标准,以及虚拟环境的未来发展如何有望完全否定在它们之间做出非此即彼的选择。我之所以关注这两个工具,正是因为它们是PyPA指定的工具。
韦恩
正如 OP 所指出的,venv是一种用于虚拟化环境的工具。不是第三方解决方案,而是本机工具。PyPA认可使用 venv创建虚拟环境: “在 3.5 版中更改:现在建议使用 venv 创建虚拟环境”。
pipenv
pipenv - 类似于venv - 可用于创建虚拟信封,但还包含包管理和漏洞检查功能。它不是使用requirements.txt
,而是通过Pipfilepipenv
提供包管理。由于PyPA认可使用 pipenv 进行包管理,这似乎意味着它将取代。pipfile
`requirements.txt`
但是:pipenv使用virtualenv作为创建虚拟信封的工具,而不是 PyPA认可的创建虚拟信封的首选工具venv 。
冲突的标准:
因此,如果确定虚拟信封解决方案还不够困难,我们现在有PyPA认可两种使用不同虚拟信封解决方案的不同工具。关于venv 与 virtualenv 的激烈 Github 争论突出了这一冲突,可在此处找到。
冲突解决:
上述链接中提到的 Github 争论已经引导virtualenv开发朝着在未来版本中适应venv的方向发展:
首选内置 venv:如果目标 python 有 venv,我们将使用它创建环境(然后对其执行后续操作以促进我们提供的其他保证)
结论:
因此看起来这两个相互竞争的虚拟信封解决方案之间未来会出现某种融合,但截至目前,所使用的pipenvvirtualenv
与 存在很大差异venv
。
鉴于pipenv解决的问题以及PyPA的支持,它似乎前景光明。如果virtualenv能够实现其提出的开发目标,那么选择虚拟信封解决方案就不再是pipenv或venv的问题了。
更新2020-08-25:
在撰写此分析时,我看到对Pipenv的一个经常被批评的是它没有得到积极维护。事实上,使用一个由于缺乏持续开发而前景不明朗的解决方案有什么意义呢?在经历了大约 18 个月的低迷期后,Pipenv再次得到了积极开发。事实上,自那以后,已经发布了大量实质性的更新。
解决方案 4:
让我们先来了解一下这些工具想要解决的问题:
用例 | 解决方案 |
---|---|
我的系统包管理器没有我想要的 Python 版本,或者我想并排安装多个 Python 版本,Python 3.9.0 和 Python 3.9.1、Python 3.5.3 等 | 然后使用 pyenv。 |
我想要安装并运行具有不同且冲突的依赖关系的多个应用程序。 | 然后使用 virtualenv 或 venv。它们几乎完全可以互换,不同之处在于 virtualenv 支持较旧的 Python 版本并且具有一些较小的独特功能,而 venv 位于标准库中。 |
我正在开发一个/应用程序/,需要管理我的依赖项,并管理我的项目依赖项的依赖项解析。 | 然后使用 pipenv 或 poetry。 |
我正在开发一个 /library/ 或一个 /package/,并想指定我的库用户需要安装的依赖项 | 然后使用setuptools。 |
我使用了虚拟环境,但我不喜欢虚拟环境文件夹分散在各个项目文件夹中。我想要集中管理环境和一些简单的项目管理 | 然后使用 virtualenvwrapper。变体:pyenv-virtualenvwrapper(如果您也使用 pyenv)。 |
不推荐
pyvenv
(!=pipenv
& !=pyenv
)。该选项已弃用,请改用 venv 或 virtualenv。
解决方案 5:
2020 年 1 月更新
@Flimm 很好地解释了所有差异。通常,我们想知道所有工具之间的差异,因为我们想决定哪种工具最适合我们。因此,下一个问题是:使用哪一个?我建议您选择两种官方方法之一来管理虚拟环境:
Python Packaging 现在推荐 Pipenv
Python.org 现在推荐 venv
解决方案 6:
pyenv-管理不同的python版本,
其他所有环境- 创建虚拟环境(其中有独立的 Python 版本并安装了“要求”),
pipenv想要结合所有内容,除了之前安装的“要求”(安装到活动的虚拟环境中,如果没有活动,则创建自己的虚拟环境)
因此,也许您只会对 pipenv 感到满意。
但我使用:pyenv + pyenv-virtualenvwrapper,+ pipenv(pipenv 仅用于安装要求)。
在 Debian 中:
apt install libffi-dev
根据https://www.tecmint.com/pyenv-install-and-manage-multiple-python-versions-in-linux/安装 pyenv ,但是..
.. 但是不要安装 pyenv-virtualenv,而是安装 pyenv-virtualenvwrapper(可以是独立库或 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 mkvirtualenv
python -m pip install --upgrade pip setuptools wheel
mkvirtualenv <venvname> -p python3.9 -a <workingdir>
并在项目之间切换:
workon <venvname>
python -m pip install --upgrade pip setuptools wheel pipenv
在项目中,我有文件 requirements.txt,无需修复其中的版本(如果某些版本限制不是必需的)。您可以使用 2 个工具将它们安装到当前虚拟环境中:pip-tools或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 安装 virtualenv 或 virtualenvwrapper,而是安装了pyenv
的插件pyenv-virtualenvwrapper
。这是更简单的方法。
Poetry
对我来说很棒:
poetry add <package> # install single package
poetry remove <package>
poetry install # if you remove poetry.lock poetry will re-calculate versions
解决方案 7:
作为 Python 新手,这个问题让我无比沮丧,困惑了好几个月。如果我知道我将在未来几年内使用它,我应该投入哪些虚拟环境和包管理器来学习?
回答这个棘手问题的最佳文章是Jake Vanderplas 撰写的https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/。虽然是几年前的,但它提供了实用的答案,并介绍了 Python 包和虚拟环境管理器在这些先进技术发展过程中的历史。
对于数据科学和“大数据云计算”社区的我来说,这尤其令人沮丧,因为 conda 被广泛用作 Python 和 JavaScript、SQL、Java、HTML5 和 Jupyter Notebooks 的虚拟环境管理器和全功能包管理器。
那么,既然 conda 可以完成 pip 和 venv 变体所做的所有事情,为什么还要使用 pip 呢?
答案是“因为如果没有 conda 包,你就必须使用 pip。”很多时候,所需的包只能以 pip 格式获得,除了使用 pip,没有其他简单的解决方案。你可以学习使用,conda build
但如果你不是包维护者,那么你必须说服包所有者为每个新版本生成一个 conda 包(或者自己动手)。
这些基于 pip 的包在许多重要且实际的方面存在差异:
稳定
到期
复杂
积极支持(相对于垂死或死亡)
Python 生态系统“核心”附近的采用水平与“边缘”的采用水平(即集成到 Python.org 发行版中)
易于理解和使用(对于初学者)
我将从套餐成熟度和稳定性两个维度来回答你关于两个套餐的问题。
venv 和 virtualenv 是最成熟、最稳定、社区支持最多的。从在线文档中可以看到,virtualenv 目前为 20.x 版本 。virtualenv
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).
virtualenvwrapper 是一组帮助人们使用 virtualenv 的脚本(它是一个维护不善的“包装器”,最后一次更新是在 2019 年) 。virtualenvwrapper
我的建议是尽可能避免使用所有 pip 虚拟环境。改用 conda。Conda 提供了一种统一的方法。它由专业开源开发人员团队维护,并有一家信誉良好的公司提供资金和商业支持版本。相比之下,维护 pip、venv、virtualenv、pipenv 和许多其他 pip 变体的团队资源有限。pip 虚拟环境的多样性让初学者感到沮丧。基于 pip 的虚拟环境工具的复杂性、碎片化、边缘和不受支持的软件包以及极不一致的支持促使我使用 conda。对于数据科学工作,我的建议是,当 conda 软件包不存在时,使用基于 pip 的虚拟环境管理器作为最后的手段。
venv 变体之间的差异仍然让我感到害怕,因为我学习新软件包的时间有限。pipenv、venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、poetry 和其他软件包有几十种差异和复杂性,需要花几天时间才能理解。我讨厌走上一条路,发现当维护者辞职(或太忙而无法维护)时,对软件包的支持就会消失。我只需要完成我的工作。
本着乐于助人的精神,这里有几个链接可以帮助您深入了解,但不会迷失在但丁的《地狱》(回复:pip)中。
Python 虚拟环境指南
选择“核心”Python 包来投资你的职业生涯(长期),而不是短期内完成一项工作)很重要。然而,这是一个业务分析问题。你是想简单地完成一项任务,还是想成为一名专业的软件工程师,构建可扩展的高性能系统,随着时间的推移,这些系统需要最少的维护工作量?恕我直言,conda 会比处理 pip-plurality 问题更容易带你到后者。conda 仍然缺少 1 步 pip-package 迁移工具,这使得这个问题变得毫无意义。如果我们可以简单地将 pip 包转换为 conda 包,那么 pypi.org 和 conda-forge 就可以合并。Pip 是必需的,因为 conda 包(目前)还不是通用的。许多 Python 程序员要么懒得创建 conda 包,要么只用 Python 编程,不需要 conda 的语言无关/多语言支持。
conda 对我来说是天赐之物,因为它支持云软件工程和数据科学对 JavaScript、SQL 和 Jupyter Notebook 扩展的多语言支持的需求,并且 conda 在 Docker 和其他云原生环境中运行良好。我鼓励您学习和掌握 conda,这将使您能够避开许多基于 pip 的工具可能永远无法回答的复杂问题。
保持简单!我需要一个可以满足我 90% 需求的软件包,以及针对剩余 10% 边缘情况的指导和解决方法。
查看此处链接的文章以了解有关基于 pip 的虚拟环境的更多信息。
我希望这对原始海报有帮助,并给 pip 和 conda 爱好者一些思考的东西。
解决方案 8:
我想添加docker
到这个列表中,以及conda
已经提到的几个答案。
conda 比标题提到的虚拟环境更重。它还可以隔离一些系统 Python 工具,例如 ffmpeg 或 gpu 驱动程序。
docker 甚至更好,它为您提供了一个全新的操作系统。有了好的 Dockerfile 和脚本docker build
,docker run
您就可以很好地记录您的环境是如何构建的,并且可以轻松填充和迁移到其他环境(暂存、生产、云)。从长远来看,它会对您有所帮助。
还有一件事:PyCharm 提供了几个选项来选择你的虚拟环境。它可以帮助新手不用担心这件事。建议在知道虚拟环境是什么之前使用它。
解决方案 9:
Python 3.3 中引入的 venv 模块是一个内置工具,用于创建独立的 Python 环境。它允许您管理各个项目的依赖项,而不会影响系统的 Python 或其他项目。它简单、轻量,并且不需要额外安装。
以下是它与类似工具的比较:
virtualenv:一种功能丰富的旧版替代方案,适用于 3.3 之前的 Python 版本,并提供更多自定义功能。pyenv:专注于管理多个 Python 版本,而不是虚拟环境。它可以与 pyenv-virtualenv 配对使用。virtualenvwrapper:添加用于管理虚拟环境环境的便捷命令。pipenv:结合虚拟环境和依赖管理,具有依赖锁定和 Pipfile 等功能。如果您使用的是 Python 3.3 或更高版本,venv 通常足以满足基本需求。如果您需要高级功能或与旧版 Python 兼容,请使用其他工具。