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

时间:2017-01-10 16:27:43

标签: python virtualenv virtualenvwrapper pyenv python-venv

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

6 个答案:

答案 0 :(得分:943)

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命令匹配(pythonpip)。这些不是Python发送的命令的副本;它们是特殊的脚本,可根据PYENV_VERSION环境变量或.python-version文件或~/.pyenv/version文件决定运行哪个版本的Python。 pyenv使用pyenv install命令使下载和安装多个Python版本的过程变得更加容易。

  • pyenv-virtualenv 是同一作者pyenv的{​​{1}}插件,允许您使用pyenv和{ {1}}同时方便。但是,如果您使用的是Python 3.3或更高版本,pyenv将尝试运行virtualenv(如果可用),而不是pyenv-virtualenv。如果您不想要便利功能,则可以在python -m venvvirtualenv一起使用virtualenvpyenv

  • virtualenvwrapper pyenv-virtualenv的一组扩展(请参阅docs)。它为您提供了virtualenvmkvirtualenv,尤其是lssitepackages等命令,可以在不同的workon目录之间进行切换。如果您需要多个virtualenv目录,此工具特别有用。

  • pyenv-virtualenvwrapper 是同一作者virtualenv的{​​{1}}插件,可方便地将pyenv整合到pyenv中}}

  • Kenneth Reitz(virtualenvwrapper的作者)的
  • pipenv 是此列表中的最新项目。它旨在将pyenvrequestsPipfile组合到命令行中的一个命令中。 pip目录通常放在virtualenv中,virtualenv是项目目录路径的哈希值。这与~/.local/share/virtualenvs/XXX不同,其中目录通常位于当前工作目录中。

    Python包装指南recommends pipenv开发时 Python应用程序(与库相对)。似乎没有 是支持XXX而不是virtualenv#15)的任何计划。 令人困惑的是,它的命令行选项venv指的是 virtualenv目录,而不是--venv,同样地,环境 变量virtualenv影响到的位置 venv目录,而不是PIPENV_VENV_IN_PROJECT目录(#1919)。

标准库:

  • virtualenv 是Python 3附带的脚本,但deprecated in Python 3.6因为它有问题(更不用说令人困惑的名字)了。在Python 3.6+中,完全等价的是venv

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

这些工具大多相互补充。例如,如果需要,virtualenv会整合venvpipenv甚至pip。这里唯一真正替代的工具是virtualenvpyenv

对初学者的建议:

这是我对初学者的个人建议:首先学习venvvirtualenv,这些工具适用于Python 2和3以及各种情况,并在您完成后选择其他工具开始需要它们。

答案 1 :(得分:159)

我会避免在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)

因此,我会避免virtualenvwrapperpipenv。不推荐使用pyvenvpyenv似乎经常在使用virtualenv的情况下使用,但我也会远离它,因为我认为venv也会为pyenv构建。venv

pip install在shell中创建 fresh sandboxed 的虚拟环境,用户可安装的库,它是< em> multi-python safe 。 Fresh 因为虚拟环境只从python附带的标准库开始,所以当虚拟环境处于活动状态时,您必须使用sudo重新安装任何其他库。 沙盒,因为这些新的库安装在虚拟环境之外都不可见,因此您可以删除整个环境并重新启动,而不必担心影响您的基本python安装。 用户可安装的库,因为虚拟环境的目标文件夹在您已拥有的某个目录中创建时没有sudo,因此您无需pyenv权限即可在其中安装库。最后它是 multi-python safe ,因为当虚拟环境激活时,shell只会看到用于构建该虚拟环境的python版本(3.4,3.5等)。

venvpyenv类似,因为它可以让您管理多个python环境。但是对于admin,您无法方便地将库安装回滚到某个启动状态,并且在某些时候您可能需要venv权限才能更新库。所以我认为最好使用virtualenv

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

答案 2 :(得分:52)

UPDATE 20200825:

添加到“ 结论 ”段落

下方

我已经走过pipenv兔子洞了(这确实是一个深而黑暗的洞... )和 ,因为最后的答案是两年多了 之前,觉得用我发现的Python虚拟信封主题的最新发展来更新讨论很有用。

免责声明:

关于继续 pipenv < strong> venv 作为信封解决方案-我都不认可任何一个。这是关于 PyPA 认可相互矛盾的标准以及 virtualenv 的未来发展如何承诺使 >或 选择。我专注于这两个工具正是因为它们是 PyPA 的受膏工具。

venv

正如OP所述, venv 是用于虚拟化环境的工具。 第三方解决方案,但是本机工具。 PyPA 认可 venv 以创建虚拟信封:“ Changed in version 3.5: The use of venv is now recommended for creating virtual environments

pipenv

pipenv -类似于 venv -可用于创建虚拟信封,但还可以用于包管理和vulnerability checking功能。 requirements.txt不是使用pipenv,而是通过Pipfile进行程序包管理。与PyPA endorses pipenv for PACKAGE MANAGEMENT一样,这似乎意味着pipfile将会取代requirements.txt

如何 pipenv 使用 virtualenv 作为创建虚拟信封的工具, venv ,并得到 PyPA 的认可,创建虚拟信封。

冲突的标准:

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

冲突解决方案:

以上链接中提及的Github辩论已将 virtualenv 开发引导至适应{em> venv { {3}}:

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

结论:

因此,看起来这两个相互竞争的虚拟信封解决方案之间将会有一些未来的融合,但是到目前为止,使用virtualenv pipenv -有所不同基本上来自venv

给出future releases,并得到 PyPA 的祝福,它 出现 拥有美好的未来。而且,如果 virtualenv 达到了其建议的开发目标,那么选择 pipenv 的情况下,不再选择虚拟信封解决方案 em>或 venv

更新20200825

我经常反复批评 Pipenv ,在进行此分析时发现它没有得到积极维护。确实,使用一种解决方案的意义何在?由于缺乏持续发展,该解决方案的未来可能会令人怀疑?经过大约18个月的干旱之后, Pipenv 再次得到积极发展。实际上,此后the problems pipenv solves进行了重大更新。

答案 3 :(得分:28)

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

我的系统包管理器没有我想要的 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 混淆。

答案 4 :(得分:7)

2020年11月更新

我们对虚拟环境有两种新的立场(均为官方):

2020年4月更新

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

尽管本教程将pipenv项目作为一种工具进行了介绍, 主要是基于Python应用程序开发的需求,而不是 Python库开发,项目本身目前正在运行 通过防止错误的几个过程和维护问题 修复和新功能无法发布(整个2019年 传递而没有新版本)。这意味着在短期内, Pipenv仍然存在一些怪癖和性能问题 没有明确解决这些问题的时间表。

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

假设2020年4月发布的Pipenv按计划进行,并且 释放之后,它仍然保持在正轨,然后在此警告 教程将被删除。如果这些发行不符合预期, 那么该教程本身将被删除,并替换为 可用的依赖项管理选项上的“讨论”页面。

答案 5 :(得分:3)

  • 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安装3.9.0

    git clone https://github.com/pyenv/pyenv-virtualenvwrapper.git $(pyenv root)/ plugins / pyenv-virtualenvwrapper

    放入〜/ .bashrc添加:导出$ VIRTUALENVWRAPPER_PYTHON =“ / usr / bin / python3”

    源〜/ .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的能力很差。也许如果使用得当,它可以代替一切吗?