venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、pipenv等之间有什么区别?

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

50
为了避免被关闭,我认为这个问题比 https://dev59.com/wl0a5IYBdhLWcg3wxrON 更加通用,因此我不想编辑那个问题或在那篇文章上发布过于笼统的答案。 - Flimm
36
这个指南非常有用,而且会不断更新,因为Python不断添加更多“一个且仅一个明显的方法”来完成任务:http://docs.python-guide.org/en/latest/dev/virtualenvs/ - michael
4
自从使用3.6版本后,我发现在 macOS 上使用 virtualenv 比 pyenv 更容易操作(我是一个 Python 新手)。 - Kermit
22
我浪费了一整天的时间在pipenv上,总的来说,它是被过度营销了。如果你需要使用py2,venv和virtualenv是正确的工具。而且,Conda(如果你不需要完整的软件栈则使用miniconda)也非常好用。这篇文章写得非常好:https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-lot-delivers-very-little/ - SwimBikeRun
8
我认为下面被接受的答案对venv存在一些不幸的偏见,而venv是使用Python 3时应该使用的正确工具。 它应该真正成为列表中的第一个,其次是virtualenv。 https://docs.python.org/3/library/venv.html - EntangledLoops
显示剩余7条评论
8个回答

2280

以下是我个人推荐给初学者的建议:从学习virtualenvpip开始,这两个工具适用于Python 2和3,并且适用于各种情况。一旦需要其他工具,可以再学习。

接下来回答一个问题:venv、virtualenv等这些同名工具有何不同?

PyPI包不在标准库中:

  • virtualenv是一个非常流行的工具,可为Python库创建隔离的Python环境。如果您不熟悉此工具,我强烈建议您学习它,因为它是非常有用的工具。

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

  • pyenv 用于隔离 Python 版本。例如,您可能希望针对 Python 2.7、3.6、3.7 和 3.8 测试代码,因此需要一种在它们之间切换的方法。激活后,它会在 PATH 环境变量前缀中添加 ~/.pyenv/shims,其中有匹配 Python 命令(pythonpip)的特殊文件。这些不是 Python 自带命令的副本;它们是特殊脚本,根据 PYENV_VERSION 环境变量、.python-version 文件或 ~/.pyenv/version 文件,在运行时决定要使用哪个版本的 Python。 pyenv 还通过命令 pyenv install 简化了下载和安装多个 Python 版本的过程。

  • pyenv-virtualenv 是由与 pyenv 同一作者开发的插件,方便您同时使用 pyenvvirtualenv。但是,如果使用的是 Python 3.3 或更高版本,则 pyenv-virtualenv 将尝试运行 python -m venv(如果可用)而不是 virtualenv。如果您不需要方便功能,也可以在没有 pyenv-virtualenv 的情况下同时使用 virtualenvpyenv

  • virtualenvwrappervirtualenv 的扩展(请参阅文档),它提供了诸如 mkvirtualenvlssitepackages 和特别是 workon 等命令,用于在不同的 virtualenv 目录之间切换。如果您需要多个 virtualenv 目录,则此工具尤其有用。

  • pyenv-virtualenvwrapperpyenv 的插件,由与 pyenv 相同的作者编写,方便地将 virtualenvwrapper 集成到 pyenv 中。

  • pipenv 旨在将 Pipfilepipvirtualenv 组合成一条命令行命令。通常将 virtualenv 目录放置在 ~/.local/share/virtualenvs/XXX 中,其中 XXX 是项目目录路径的哈希值。这与 virtualenv 不同,virtualenv 的目录通常位于当前工作目录中。 pipenv 适用于开发 Python 应用程序(而不是库)。还有其他替代品,例如 poetry,但由于本问题仅涉及类似命名的软件包,因此我不会列出它们。

  • 标准库:

    • pyvenv(不要与前一部分中的pyenv混淆)是Python 3.3到3.7附带的脚本。由于存在问题(更不用提令人困惑的名称了),它在Python 3.8中被删除。运行python3 -m venv的效果与运行pyvenv完全相同。

    • venv是Python 3附带的一个包,可以使用python3 -m venv来运行它(虽然由于某些原因,某些发行版将其拆分为单独的发行版包,例如Ubuntu/Debian上的python3-venv)。它的作用与virtualenv相同,但只具有其功能的子集(在此处查看比较)。virtualenv仍然比venv更受欢迎,特别是因为前者支持Python 2和3。


    320
    非常有帮助!那么为什么有8个纠缠在一起的东西而不是1个呢?(“应该有一种明显的方法来做到这一点,最好只有一种”--《Python之禅》) - Jerry101
    130
    @Jerry101,“venv”的介绍部分是为了应对混乱局面。如果您想帮助改善情况,我建议您使用“venv”并鼓励其他人也这样做。 - Magnus Lind Oxlund
    85
    “venv”的推出在某种程度上是对混乱局面的回应。 - Kris
    68
    列表中唯二真正涵盖同一领域的工具是 virtualenv 和 venv,因此说我们面对由几个竞争工具引起的混乱并不十分精确。然而,列表中包含多个与虚拟环境相关的工具,它们的名称听起来非常相似,这可能会让刚开始了解它们的用户感到困惑。venv 改善了情况吗?它提供了一个更轻量级的替代方案,受益于本地修改和标准库中的位置。… - Magnus Lind Oxlund
    36
    必看 xkcd 漫画:https://xkcd.com/927/(译注:该漫画是一幅关于标准化和互操作性的幽默漫画,引用了“标准委员会”的笑话,并将其应用于软件开发中常见的标准化问题。) - Steven Lu
    显示剩余16条评论

    574

    在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)
    

    因此,我会避免使用virtualenvwrapperpipenvpyvenv已被弃用。 pyenv似乎经常用于virtualenv使用的地方,但我也会远离它,因为我认为venv也可以做pyenv构建的事情。 venv在shell中创建虚拟环境,这些环境是新鲜的隔离的,具有用户可安装的库,并且是多Python安全的新鲜的:因为虚拟环境仅从python附带的标准库开始,所以您必须在虚拟环境处于活动状态时重新安装任何其他库。 隔离的:因为这些新库安装中没有一个是在虚拟环境之外可见的,因此您可以删除整个环境并重新开始而不必担心影响基本python安装。 用户可安装的库:因为虚拟环境的目标文件夹是在您已经拥有的某个目录中创建的,因此您不需要sudo权限将库安装到其中。 多Python安全的:因为当虚拟环境激活时,shell仅看到用于构建该虚拟环境的python版本(3.4、3.5等)。

    pyenv类似于venv,可以让您管理多个Python环境。但是,使用pyenv时,您无法方便地回滚库安装到某个起始状态,并且在更新库时可能需要admin权限。因此,我认为最好使用venv

    在过去的几年中,我发现了许多构建系统(emacs包、Python独立应用程序构建器、安装程序等)的问题,这些问题最终归结为与virtualenv有关的问题。我认为当我们消除这个额外选项并仅使用venv时,Python将成为更好的平台。

    编辑:BDFL的推文,

    我使用stdlib中的venv和一堆shell别名来快速切换。

    — Guido van Rossum (@gvanrossum) 2020年10月22日


    5
    @RiazRizvi的回答很好,提供了许多启示。然而,我认为虽然venv在虚拟环境中越来越流行,但pyenv仍然有其优势。我目前可以想到的一个经典理由是,AWS Lambda支持的最高Python运行时版本是3.8,而Python 3.9已经发布,我希望其他非Lambda项目基于3.9。因此,我仍然需要pyenv来在版本之间切换。使用pyenv-virtualenv允许用户同时使用pyenvvenv(不是virtualenv)。 - azec-pdx
    1
    virtualenvwrapper 有什么问题吗? - user32882
    5
    如何为不同的Python版本创建虚拟环境?我之前认为默认会使用创建虚拟环境时系统中已安装的Python版本。 - soMuchToLearnAndShare
    3
    有很多需要学习和分享的东西 - 明确调用你想要使用的Python - $ path/to/python3x -m venv <MYVENVx> $ path/to/python3y -m venv <MYVENVy> ,然后当你激活环境时,你将激活用于创建环境的Python。 - Rian Rizvi
    2
    Conda是virtualenv的包装器,因此所有virtualenv的缺点也适用于Conda。但是,Conda确实验证它们支持的软件包,因此尽管它仅提供了Python软件包的子集,特别是对于数据科学而言,它们拥有大部分所需内容。我认为,对于只使用Windows的用户,他们往往在命令行上表现较弱,Conda是一个安全的选择,特别是对于数据科学家。但是,如果您想要完全清晰地了解您的环境,例如将解决方案部署给客户,并且您想要完全访问所有最新的软件包,请坚持使用pip,它具有与Python本身一样多的支持。 - Rian Rizvi
    显示剩余4条评论

    118

    更新 2020-08-25:

    在下面添加了“结论”段落

    我深入研究了 pipenv(它确实是一个深而黑暗的洞穴...),因为上一次回答已经超过2年了,所以觉得有必要更新一下关于Python虚拟信封主题的最新进展。

    免责声明:

    这个回答不是关于继续争论 pipenvvenv 作为信封解决方案的优劣之处 - 我对任何一种都不做支持。它关于 PyPA 支持相互冲突的标准以及未来 virtualenv 的发展承诺将消除对它们之间进行 二选一 选择的需求。我专注于这两个工具,正是因为它们是由 PyPA 授权的。


    venv

    正如OP所指出的,venv是一种用于虚拟化环境的工具。它不是第三方解决方案,而是本地工具。 PyPA认可venv用于创建虚拟封套:"从版本3.5开始更改:现在推荐使用venv来创建虚拟环境"

    pipenv

    pipenv - 类似于 venv - 可用于创建虚拟环境,但还包含了软件包管理和漏洞检查功能。与使用requirements.txt不同,pipenv通过Pipfile提供软件包管理。由于PyPA认可pipenv用于软件包管理, 这似乎意味着pipfile将取代requirements.txt

    然而: pipenv使用virtualenv作为创建虚拟环境的工具,而不是被PyPA认可的首选工具venv

    标准冲突:

    如果选择一个虚拟信封解决方案已经很困难了,现在我们还面临着PyPA认可使用不同虚拟信封解决方案的两种工具。关于venv与virtualenv的激烈Github辩论凸显了这一冲突,可以在这里找到。

    冲突解决:

    上述链接中提到的Github辩论已经引导virtualenv的发展朝着适应venv的方向发展,将在未来版本中实现:

    优先使用内置的venv:如果目标Python有venv,我们将使用它创建环境(然后在此基础上执行后续操作以便提供其他保证)


    结论:

    看起来两个竞争对手的虚拟信封解决方案将会有一些未来的融合,但目前为止,使用pipenvvirtualenvvenv存在实质性差异。

    考虑到pipenv解决的问题以及PyPA的认可,它似乎有着光明的未来。而如果virtualenv能够实现其提出的开发目标,选择一个虚拟信封解决方案将不再是pipenv或者venv的问题。

    2020-08-25更新:

    在我进行这个分析时,经常听到关于Pipenv的一个批评是它没有得到积极的维护。确实,使用一个未来可能因缺乏持续开发而有问题的解决方案有何意义呢?在大约18个月的干旱期之后,Pipenv再次开始积极开发。的确,自那时以来已经发布了重大的更新released


    3
    那pyenv呢?这是一个不错的回答,因为它考虑了未来的方向,但它与pyenv、conda或其他环境管理器的交互方式并不明确。 - naught101
    @naught101 pyenv 不是 virtualenv 的替代品。而且这两个东西都不是 pipenv 的替代品。它们做的事情不同。就像 Django、Python 和 PostgreSQL 是不同的东西一样。 - Flimm
    @Flimm:不同在哪里? - naught101
    @naught101 请查看此问题帖子的其他答案(包括我的答案)。 - Flimm
    1
    @icedwater 我想你的意思是“Anaconda”提供了出色的付费服务。“conda”是一个免费且开源的环境和包管理器,由开源社区维护。“Anaconda”向非商业或中小企业用户提供免费的Python发行版,并为企业用户提供付费的Python发行版和服务。现在,Mamba基金会提供了Mamba-forge,这是一个更快、100%兼容conda命令的命令行工具,用C++编写,比conda或venv在进度报告方面更好。 - undefined
    显示剩余2条评论

    99
    让我们从这些工具想要解决的问题开始:
    使用场景 解决方案
    我的系统包管理器没有我想要的Python版本,或者我想要同时安装多个Python版本,比如Python 3.9.0和Python 3.9.1,Python 3.5.3等 那就使用pyenv。
    我想要安装和运行多个具有不同、冲突依赖的应用程序。 那就使用virtualenv或venv。这两者几乎可以互换使用,区别在于virtualenv支持较旧的Python版本并具有一些更多的独特功能,而venv则是Python标准库的一部分。
    我正在开发一个应用程序,并且需要管理我的依赖项,以及管理我的项目的依赖项解析。 那就使用pipenv或poetry。
    我正在开发一个库或包,并希望指定我的库用户需要安装的依赖项。 那就使用setuptools。
    我曾经使用过virtualenv,但是我不喜欢virtualenv文件散落在各个项目文件夹中。我希望能够集中管理环境并进行一些简单的项目管理。 那就使用virtualenvwrapper。变种:如果你还使用pyenv,可以使用pyenv-virtualenvwrapper。

    不推荐使用

    • pyvenv (!=pipenv & !=pyenv)。这已经过时了,请改用 venv 或 virtualenv。

    4
    Conda怎么样?你会完全不推荐它吗?在pipenv和poetry之间做决定时,你会使用哪些信息?建议不要完全反对Conda。在选择pipenv和poetry之间,可以考虑以下因素:项目需要哪些依赖项、如何管理虚拟环境、个人喜好以及与团队的协作等。 - naught101
    3
    pipenv/poetry使用两个文件来管理依赖关系,第一个文件指定逻辑依赖关系,第二个文件是由pipenv/poetry自动生成的依赖锁定文件。requirements.txt在某种程度上将这两个文件混合在一起,虽然更简单,但没有单独的锁定文件使得它不太灵活,并且难以维护依赖列表。 - Lie Ryan
    1
    @soMuchToLearnAndShare pipenv是建立在virtualenv/venv之上的,因此您总是要一起使用它们。Pipenv比virtualenv添加了许多更高级别的功能,特别是依赖管理。Virtualenv不管理依赖项,它所做的只是提供一个隔离的环境来安装依赖项。 - Lie Ryan
    1
    @soMuchToLearnAndShare venv在标准库中可用,这是比virtualenv更大的优势。我不想替PyPA说话,但virtualenv确实有一些venv没有的额外功能,并且它可以在更广泛的Python版本范围内工作。如果您需要virtualenv提供的附加功能,则显然应该使用virtualenv。如果您对当前的venv设置感到满意,则没有理由选择virtualenv。 - Lie Ryan
    1
    @soMuchToLearnAndShare 但如果你不介意额外的安装,也没有理由避免使用virtualenv。如果你想使用pipenv,那么它只支持virtualenv。没有理由因为pipenv使用virtualenv就避免使用它,特别是因为使用pipenv已经意味着你需要额外的安装。最终,virtualenv和venv创建的环境目录几乎相同,所以你选择虚拟环境工具的大部分影响只在创建环境时体现,而在使用时则影响较小。 - Lie Ryan
    显示剩余7条评论

    24

    2020年1月更新

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


    1
    请注意,pipenvvenv并不是彼此的替代品,就像Django和Python也不是彼此的替代品。仅使用venv,您无法安装软件包,而pipenv提供了一种安装软件包的机制。 - Flimm
    2
    当你说使用__venv__时无法安装软件包时,我并没有理解你的意思。我的意思是,在使用venv创建的虚拟环境中,我可以安装通过pip提供的所有软件包,例如,我在4个不同的目录中有4个不同版本的Python和Pandas,但是相同的Jupyter Lab版本,全部都是通过venv创建的虚拟环境安装的。 - ArnuldOnData
    @Flimm python -m venv foo; source foo/bin/activate; pip install numpyvenvpip都可以直接使用。这个注释听起来有点误导性。 - Magnus Lind Oxlund
    @MagnusLindOxlund 在你的示例中,你不能用 pip 替换 venv ,反之亦然。你不能执行 venv install numpy,也不能执行 pip foo; source foo/bin/activate。因此,我坚持认为它们不是彼此的替代品。另外,在 Ubuntu 安装中,venvpip 都不是开箱即用的(尽管 python3 是开箱即用的)。在 Ubuntu 上,你需要安装 python3-venv(使用 APT)来获取 venv,并且你需要单独安装 python3-pip 来获取 pip - Flimm

    18
    • pyenv - 管理不同的 Python 版本,
    • 其他工具 - 创建虚拟环境(其中有独立的 Python 版本和已安装的“需求”),

    pipenv 希望将所有内容结合起来,除了之前提到的内容外,它还会安装“需求”(在活动虚拟环境中或创建自己的虚拟环境,如果没有活动的虚拟环境)。

    因此,也许您只需要用 pipenv 工具就可以了。

    但是,我使用 pyenv + pyenv-virtualenvwrapper,再加上 pipenv (仅用于安装需求)。

    在 Debian 中:

    1. apt install libffi-dev

    2. install pyenv based on https://www.tecmint.com/pyenv-install-and-manage-multiple-python-versions-in-linux/, but..

    3. .. but instead of pyenv-virtualenv install pyenv-virtualenvwrapper (which can be standalone library or pyenv plugin, here the 2nd option):

      $ 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
      

    接着为你的项目创建虚拟环境(工作目录必须存在):

    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的文件,其中没有固定版本(如果不需要某些版本限制)。你有两种可能的工具来将它们安装到当前虚拟环境中:pip-toolspipenv。假设您将使用pipenv:

    pipenv install -r requirements.txt
    

    这将创建Pipfile和Pipfile.lock文件,固定版本在第二个文件中。如果您想要在其他地方重新安装完全相同的版本,则需要存在Pipfile.lock文件:

    这会生成Pipfile和Pipfile.lock文件,确定的版本在后者中。如果您希望在其他地方重新安装完全相同的版本,则需要有Pipfile.lock文件:

    pipenv install
    

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

    正如您所看到的,我编写了 requirements.txt。这有一些问题:您必须从 Pipfile 中删除已删除的软件包。因此,直接编写 Pipfile 可能更好。

    所以你可以看到我不太会使用 pipenv。也许如果您使用得当,它可以替代所有东西吗?

    编辑 2021.01: 我将我的堆栈更改为:pyenv + pyenv-virtualenvwrapper + poetry。即,我不使用 virtualenv 或 virtualenvwrapper 的 apt 或 pip 安装,而是安装 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
    

    1
    请问您能详细介绍一下您目前的技术栈,也就是 pyenv + pyenv-virtualenvwrapper + poetry,尤其是如何指示 poetry 使用通过 pyenv 安装的特定版本,并且是否禁用了 poetry 中创建虚拟环境的功能? - Yassine Sedrani
    听起来很混乱,难以理解和跟踪!你不能使用conda包的环境和包管理器功能消除所有这些繁琐的步骤吗?conda是一个单一的工具,可以完成你回答中提到的三个或四个软件包的工作。 - Rich Lysakowski PhD

    1

    我想要将docker加入到这个列表中,并且还有一些答案已经提到的conda

    conda比标题提到的虚拟环境更重,它也能隔离一些系统Python工具,例如ffmpeg或gpu驱动程序。

    docker更好,它为您提供了一个全新的操作系统来使用。通过一个良好的Dockerfile和docker builddocker run脚本,您可以很好地记录环境是如何构建的,并且很容易进行填充、迁移到其他环境(staging、production、cloud)。它在长期的运行过程中会帮助您。

    另外,PyCharm提供了几个选项来选择您的虚拟环境。这有助于新手不用担心这个问题。建议在了解什么是虚拟环境之前使用它。


    这个问题涉及到名称非常相似的 "env" 的事物,而不是像 Docker 或 Conda 这样的工具。 - Flimm
    2
    我认为这个讨论应该扩展到“在开发或生产环境中使用不同的Python版本的最佳方式是什么”。那更有价值。 - Ben L
    1
    我知道你的意思。老实说,我所提出的问题并不是人们访问这个页面时需要回答的问题。Stack Overflow的系统是关于特定的问答,总的来说,我发现它运作得相当好,但在这个问题上似乎有些失效了,而这个问题是我最受欢迎的帖子之一。 - Flimm

    -2
    作为 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 is a tool to create isolated Python environments. Since Python 3.3, a subset of it has been integrated into the standard library under the venv module. The venv module does not offer all features of this library, to name just a few more prominent:

    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的虚拟环境工具的复杂性、分裂、边缘和不受支持的软件包以及极不一致的支持使我转而使用conda。对于数据科学工作,我的建议是在conda软件包不存在时,将pip-based虚拟环境管理器作为最后的选择。

    venv的变体之间的差异仍然让我感到害怕,因为我的时间有限,无法学习新的软件包。pipenv、venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、poetry和其他工具之间有数十个差异和复杂性需要花费数天时间才能理解。当维护者辞职(或太忙而无法维护)时,我讨厌走下一条路并发现对软件包的支持已经停止。我只需要完成我的工作。

    为了有所帮助,在这里提供一些链接,帮助您深入了解,但不会迷失在Dante's Inferno中(关于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的虚拟环境的知识。

    希望这对原帖作者有所帮助,并为pip和conda爱好者提供一些思考的方向。


    3
    Pip的存在是必要的,因为conda包目前还不是通用的。许多Python程序员要么懒得创建conda包,要么只编写Python代码,不需要conda的语言无关/多语言支持。这是否暗示了不应使用conda呢?或者如果conda想要成为通用的工具,那么很快就应该有一个明确的时间表。因此,尽管有许多pip/virtualenv版本可供选择,但最好选择一个获胜者并取消其他所有版本,而不是选择conda...(virtualenv[wrapper]已经成为获胜者了吗?) - arntg
    我的答案偏向于简单,即使用一个工具来管理Python和其他语言的虚拟环境、依赖和包。conda系统只缺少一个功能/模块,就可以使这个混乱的替代方案消失并变得无关紧要,即一个可靠地将任何pip-only格式的软件包转换为conda软件包的模块。conda比包括pipenv、virtualenv、venv、pyenv、poetry和其他工具在内的碎片化角色更好地得到支持。很快就会有人写出一个功能性的转换器。 - Rich Lysakowski PhD
    我上周刚发现了一个叫做“pip2conda”的软件包。等我有时间测试它之后,我会告诉你它是否能够实现其名称的承诺。 - Rich Lysakowski PhD
    1
    Conda的动机是拥有一个单一、统一的软件包和环境管理器。降低复杂性,为同时也是多语言使用者的Pythonista简化生活。“应该只有一种——最好只有一种——明显的方法来做它。” Python之禅,Tim Peters ... 简单胜于复杂。 ... 应该只有一种——最好只有一种——明显的方法来做它。 ... 如果实现难以解释,那就是个坏主意。 如果实现容易解释,那可能是个好主意。 ... Conda是一个非常棒的想法——让我们做更多这样的事情! - Rich Lysakowski PhD
    看起来这些都没有具体的问题,使用pipvenv等工具时不会遇到任何困扰。多年来,我使用这些工具从未感到烦恼。 - Karl Knechtel

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接