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

Fli*_*imm 800 python virtualenv virtualenvwrapper python-venv pyenv

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

Fli*_*imm 1134

PyPI包不在标准库中:

  • virtualenv是一个非常流行的工具,它为Python库创建了独立的Python环境.如果你不熟悉这个工具,我强烈建议学习它,因为它是一个非常有用的工具,我将在这个答案的其余部分进行比较.

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

  • 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使用该命令还可以更轻松地下载和安装多个Python版本pyenv install.

  • pyenv-virtualenvpyenv同一作者的插件pyenv,允许您方便地使用pyenvvirtualenv同时使用.但是,如果您使用的是Python 3.3或更高版本,pyenv-virtualenv则会尝试在python -m venv可用时运行,而不是virtualenv.您可以使用virtualenvpyenv一起没有pyenv-virtualenv,如果你不想要的便利功能.

  • virtualenvwrapper是一组扩展virtualenv(见文档).它为您提供了类似的命令mkvirtualenv,lssitepackages尤其workon适用于在不同virtualenv目录之间切换.如果您需要多个virtualenv目录,此工具特别有用.

  • pyenv-virtualenvwrapper是一个插件pyenv由同一作者的pyenv,可以方便地集成virtualenvwrapperpyenv.

  • pipenv由Kenneth Reitz(作者requests)撰写,是该列表中的最新项目.它旨在结合Pipfile,pipvirtualenv为在命令行一个命令.该virtualenv目录通常被放入~/.local/share/virtualenvs/XXX,XXX作为项目目录路径的哈希.这virtualenv与目录通常位于当前工作目录中的情况不同.

    Python Packaging Guide 建议pipenv在开发Python应用程序时(而不是库).似乎没有任何计划支持venv而不是virtualenv(#15).令人困惑的是,它的命令行选项--venv是指 virtualenv目录,而不是venv,同样,环境变量PIPENV_VENV_IN_PROJECT会影响virtualenv目录的位置 ,而不是venv目录(#1919).

标准图书馆:

  • pyvenv是Python 3附带的一个脚本,但在Python 3.6中已弃用,因为它有问题(更不用说令人困惑的名字).在Python 3.6+中,确切的等价物是python3 -m venv.

  • venv是Python 3附带的一个包,您可以使用它运行python3 -m venv(虽然由于某种原因,一些发行版将它分成一个单独的发行版包,例如python3-venv在Ubuntu/Debian上).它具有类似的用途virtualenv,并以非常类似的方式工作,但它不需要复制Python二进制文件(Windows除外).如果你不需要支持Python 2,请使用它.在撰写本文时,Python社区似乎很满意,virtualenv而且我没有多少谈论过venv.

大多数这些工具相互补充.例如,pipenv集成pip,virtualenv甚至pyenv是需要的.这里唯一真正替代的工具是venvvirtualenv.

对初学者的建议:

这是我对初学者的个人建议:从学习virtualenvpip使用Python 2和3以及各种情况的工具开始,一旦你开始需要它们,就拿起其他工具.

  • 这非常有帮助!那么为什么有8个纠结的东西而不是1个呢?("应该有一个 - 最好只有一个 - 显而易见的方法." - Python的禅宗) (85认同)
  • @Jerry101,venv的引入部分是对这个烂摊子的回应.如果你想帮助改善这种情况,我建议你使用venv并鼓励其他人也这样做. (43认同)
  • 列表中唯一真正涵盖可以说是相同领域的两个工具是virtualenv和venv,因此我们处理由几个竞争工具引起的混乱的特征并不十分准确.但是,该列表包含几个与虚拟环境相关的工具,所有这些工具都具有相似的名称.这可能会令人困惑,特别是对刚刚了解它们的用户而言.venv改善了情况吗?它确实为其他虚拟环境工具提供了更轻量级的替代方案,受益于本机修改和标准库中的一个位置.... (29认同)
  • "venv的引入部分是对这种混乱的回应"当有太多东西做'像X'之类的东西时,人们总是认为他们可以通过做出像'X这样的'其他东西来改善这种混乱.实际上有点好笑.我们现在已经4年了......所以可能有问题,"venv"真的能解决这个问题吗? (26认同)
  • @cowbert在从Python 3.5升级到Python 3.6并让我所有的virtualenvs中断后,看起来像`venv`可以让你更容易升级到新的Python版本. (10认同)
  • 因此,由于答案的全面性,为什么不在conda创建的环境中添加两分钱?老实说,我想知道你的想法. (6认同)
  • 通常情况下,只是在市场上拥有一个优越的选择并不能保证其统治地位.Python 2到3迁移期间的用户习惯和跨版本支持等因素减慢了venv作为标准的任何潜在采用.通过实施标准清除工具箱需要花费时间,如果不鼓励和支持转换,则只需要更长的时间. (3认同)
  • 考虑使用Docker. (3认同)
  • pipenv应该移到列表的最后一项。当一个好的解决方案应同时解决这两个问题时,它将问题分为“库与应用程序”。打包是python最薄弱的方面之一,尤其是杂乱无章的工具只能完成一半的工作,并且在其他方​​面也很出色。别名可以完成virtualenvwrapper对virtualenv所做的工作。当venv(或virtualenv)是正确的工具时,由于其错误的说法,我在Pipenv上浪费了很多时间。https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-lot-delivers-very-little/ (3认同)
  • 并且没有一个适当地使用`LD_LIBRARY_PATH`怪异或者如果`PATH`已经被说,`modules`.除了硬链接和核心捆绑之外,还有一个理智的理由是,"venv"比"virtualenv"更好吗? (2认同)
  • @Kris _我们现在已经是 4 年后了......所以可能有必要问一下,venv 真的解决了这个问题吗?_ - 它没有,因为它仍然需要一些神奇的批次来_激活_环境。我应该能够使用没有这些解决方法的环境。这就是为什么我从不使用任何环境,而是克隆整个 python 安装并使用它,因为这是运行脚本的唯一方法,而不必关心如何正确激活任何东西。只要_激活_是必要的,问题就没有解决。 (2认同)

Ria*_*zvi 213

我只是避免使用virtualenvPython3.3 +之后使用标准的附带库venv.要创建新的虚拟环境,您可以键入:

$ python3 -m venv <MYVENV>  
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

因此,我会避免virtualenvwrapperpipenv.pyvenv已弃用.pyenv似乎经常使用在哪里virtualenv使用,但我也会远离它,因为我认为venv也做了什么pyenv建设.

venv在shell中创建新的沙盒的虚拟环境,具有用户可安装的库,并且它是多蟒蛇安全的.很新,因为虚拟环境只从python附带的标准库开始,你必须pip install在虚拟环境处于活动状态时重新安装任何其他库.沙盒,因为这些新的库安装都不在虚拟环境之外可见,因此您可以删除整个环境并重新启动,而不必担心影响您的基本python安装.用户可安装的库,因为虚拟环境的目标文件夹是在sudo您已经拥有的某个目录中创建的,因此您无需在其中sudo安装库的权限.最后它是多python安全的,因为当虚拟环境激活时,shell只会看到用于构建该虚拟环境的python版本(3.4,3.5等).

pyenv类似于venv它可以让你管理多个python环境.但是,pyenv您无法方便地将库安装回滚到某些启动状态,并且您可能需要admin在某些时候才能更新库.所以我觉得最好用venv.

在过去几年中,我发现构建系统(emacs包,python独立应用程序构建器,安装程序......)中存在许多问题,最终归结为问题virtualenv.我认为当我们消除这个额外选项并且仅使用时,python将是一个更好的平台venv.

  • 好的,所以我已经在/sf/ask/3369126001/上确认对'PYTHONPATH`的正确更新不需要`add2virtualenv`.关于你的第一条评论缺乏对SO的帮助,我唯一的建议是如果他们解决了你的问题,那就是为了激励人们在发帖时为你排除故障?半小时的调查+记录以换取鼠标点击?听起来像一个很好的交易...... (14认同)
  • @ MalikA.Rumi祝福已经略微减少为"Pipenv创作者努力向我们和其他人推销,这就是为什么我们提到Pipenv". (8认同)
  • 不,你是对的 - 我试着善于提升.哎呀,如果你在我的地区,我会给你买啤酒.我将继续遵守我的承诺,看看python doc人员是否会让我将更改添加到/ bin /激活官方文档以保持清晰.虽然我不是很棒,但我对python并不害怕.如果对我来说很难......无论如何,谢谢你的时间 - 祝你万事如意. (7认同)
  • 很好的答案@RiazRizvi,它提供了与接受的答案并行的许多见解。然而,我认为尽管“venv”在虚拟环境中受到了关注,但“pyenv”仍然占有一席之地。我现在能想到的在工作流程中仍然使用“pyenv”的典型原因是 AWS Lambda 支持的最高 Python 运行时是 3.8,而 Python 3.9 已经过时了,我希望其他非 Lambda 项目基于 3.9。所以我仍然需要`pyenv`来在版本之间切换。使用“pyenv-virtualenv”允许用户同时使用“pyenv”和“venv”(而不是“virtualenv”)。 (5认同)
  • @riaz rizvi Multi python safe:如何为不同的python版本创建虚拟环境?我认为它始终默认为用于创建 venv 的 python(系统范围安装)版本 (5认同)
  • @AndreaMoro已过时的是pyvenv,而不是pyenv。容易混淆这些工具的名称。 (4认同)
  • `add2virtualenv`通过在`site-packages`下添加一个自定义`_virtualenv_path_extensions.pth`文件来调整你的'PYTHONPATH`.或者,您可以更新每次激活虚拟环境时调用的`bin/activate`文件中的`PYTHONPATH`环境变量.或者你可以在`site-packages`下添加符号链接指向额外的目录.这两种替代方案对于开发人员广泛用于排除故障的传统命令行工具更加透明.使用带有未记录名称的自定义`.pth`使其看起来更加神奇IMO. (3认同)
  • somuchtoearnandshare - 对要使用的 python 进行显式调用 - `$ path/to/python3x -m venv &lt;MYVENVx&gt; ` 或 `$ path/to/python3y -m venv &lt;MYVENVy&gt; ` 然后当您激活环境时将激活用于创建环境的Python (3认同)
  • Conda 是 virtualenv 的包装器,因此 virtualenv 的所有缺点都适用于 Conda。然而 Conda 确实验证了它们支持的包,因此虽然它只提供所有 Python 包的子集,但特别是对于数据科学,它们拥有您需要的大部分内容。我想说,对于命令行能力较弱的 Windows 用户来说,Conda 是一个安全的选择,尤其是数据科学家。但是,如果您希望完全了解您的环境,例如向客户部署解决方案,并且您希望完全访问所有最新的软件包,请坚持使用 pip,它具有与 Python 一样多的支持。 (3认同)
  • 编辑"PYTHONPATH"必须正常工作,请参阅/sf/ask/333002491/.如果你遇到问题发布评论,我会为你排除故障.`PYTHONPATH`获取*父文件夹*的路径,而不是模块本身.如果您遇到问题,请参阅此问题/sf/ask/1394224471/(或手册!https://docs.python.org/3/using/cmdline.html# ENVVAR-PYTHONPATH) (2认同)

F1L*_*nux 77

更新 20200825:

在“结论”段落下方添加

我已经进入了pipenv兔子洞(它确实是一个又深又黑的洞......)并且由于最后一个答案是在 2 年前,我觉得用 Python 虚拟信封主题的最新发展更新讨论很有用我找到了

免责声明:

这个答案不是要继续关于pipenv venv作为信封解决方案的优点的激烈辩论 -我不认可任何一个。这是关于PyPA认可相互冲突的标准,以及virtualenv 的未来发展如何承诺完全否定在它们之间做出一个/或一个选择。我之所以专注于这两个工具,正是因为它们是PyPA 的恩膏

venv

正如 OP 所指出的,venv是一种用于虚拟化环境的工具。不是第三方解决方案,而是本机工具。PyPA支持venv来创建虚拟环境:“在 3.5 版中更改:现在建议使用 venv 来创建虚拟环境”。

管道

pipenv - 与venv类似- 可用于创建虚拟信封,但另外还包含包管理和漏洞检查功能。而不是使用requirements.txtpipenv通过Pipfile提供包管理。由于PyPA支持 pipenv 用于PACKAGE MANAGEMENT,这似乎意味着pipfile要取代requirements.txt.

然而pipenv使用virtualenv作为其创建虚拟信封的工具,而不是 venv,它被PyPA认可为创建虚拟信封的首选工具。

冲突标准:

因此,如果确定虚拟信封解决方案还不够困难,我们现在让PyPA支持两种使用不同虚拟信封解决方案的不同工具。Github 关于venv 与 virtualenv的激烈争论突出了这种冲突,可以在这里找到。

解决冲突:

上面链接中引用的 Github 辩论将virtualenv 的开发导向了未来版本中适应venv的方向:

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

结论:

因此,看起来这两个竞争对手的虚拟信封解决方案之间未来会有一些融合,但截至目前,使用的pipenvvirtualenvvenv.

考虑pipenv解决的问题以及PyPA的祝福,它似乎有着光明的未来。如果virtualenv实现其提议的开发目标,则选择虚拟信封解决方案不应再是pipenvvenv 的情况

更新 20200825

我在进行此分析时看到的对Pipenv 的反复批评是它没有得到积极维护。事实上,使用一个未来可能因缺乏持续开发而受到质疑的解决方案有什么意义?经过大约 18 个月的干旱期,Pipenv再次得到积极开发。实际上,此后已经发布了大量重要的更新。

  • 那么 pyenv 呢?这是一个很好的答案,因为它着眼于未来的方向,但不清楚它如何与 pyenv 或 conda 或其他环境管理器交互 (3认同)

Lie*_*yan 32

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

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

然后使用pyenv。

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

然后使用 virtualenv 或 venv。它们几乎完全可以互换,不同之处在于 virtualenv 支持较旧的 python 版本并具有一些更小的独特功能,而 venv 在标准库中。

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

然后使用 pipenv 或诗歌。

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

然后使用设置工具。

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

然后使用 virtualenvwrapper。变体: pyenv-virtualenvwrapper 如果您也使用 pyenv。


不建议

  • pyvenv。这已被弃用,请改用 venv 或 virtualenv。不要与 pipenv 或 pyenv 混淆。

  • 康达呢?您会建议完全反对吗?您会使用哪些信息来决定 Pipenv 和诗歌? (5认同)
  • Pipenv/poetry 使用两个文件工作流程来管理依赖关系。第一个文件指定逻辑依赖关系,第二个文件是由pipenv/poetry自动生成的依赖关系锁定文件。requirements.txt 有点像两个文件的混合,它更简单,但没有单独的锁定文件使得它不太灵活并且更难维护依赖项列表。 (3认同)

Arn*_*uld 17

2020 年 1 月更新

@Flimm 很好地解释了所有差异。一般来说,我们想知道所有工具之间的区别,因为我们想决定什么最适合我们。那么,下一个问题是:使用哪个?我建议您选择两种官方方式之一来管理虚拟环境:

  • 当您说 __venv__ 无法安装软件包时,我没有明白您的意思。我的意思是我可以在使用 **venv** 创建的虚拟环境中安装通过 **pip** 可用的所有内容,例如,我在 4 个不同的目录中有 4 个不同的虚拟环境,具有不同的 python 和 pandas 版本,但具有相同的 jupyter lab 版本。贯穿**venv** (2认同)

mir*_*rek 8

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

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

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

但我使用: pyenv + pyenv-virtualenvwrapper, + 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-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
    
    Run Code Online (Sandbox Code Playgroud)

然后为您的项目创建虚拟环境(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>
Run Code Online (Sandbox Code Playgroud)

并在项目之间切换:

workon <venvname>
python -m pip install --upgrade pip setuptools wheel pipenv
Run Code Online (Sandbox Code Playgroud)

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

pipenv install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

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

pipenv install
Run Code Online (Sandbox Code Playgroud)

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

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

所以你可以看到我使用 pipenv 非常糟糕。也许如果你用好它,它可以取代一切?

编辑 2021.01:我已将堆栈更改为:pyenv + pyenv-virtualenvwrapper + poetry。IE。我没有使用 virtualenv 或 virtualenvwrapper 的 apt 或 pip 安装,而是安装了pyenv的 plugin pyenv-virtualenvwrapper。这是更简单的方法。

Poetry 对我来说很棒:

poetry add <package>   # install single package
poetry remove <package>
poetry install   # if you remove poetry.lock poetry will re-calculate versions
Run Code Online (Sandbox Code Playgroud)