当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《venv,pyvenv,pyenv,virtualenv,virtualenvwrapper,pipenv等有什么区别?》经验,为你挑选了2个好方法。

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



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

2> Riaz Rizvi..:

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

$ python3 -m venv   

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.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/17360801/上确认对'PYTHONPATH`的正确更新不需要`add2virtualenv`.关于你的第一条评论缺乏对SO的帮助,我唯一的建议是如果他们解决了你的问题,那就是为了激励人们在发帖时为你排除故障?半小时的调查+记录以换取鼠标点击?听起来像一个很好的交易......
@ MalikA.Rumi祝福已经略微减少为"Pipenv创作者努力向我们和其他人推销,这就是为什么我们提到Pipenv".
不,你是对的 - 我试着善于提升.哎呀,如果你在我的地区,我会给你买啤酒.我将继续遵守我的承诺,看看python doc人员是否会让我将更改添加到/ bin /激活官方文档以保持清晰.虽然我不是很棒,但我对python并不害怕.如果对我来说很难......无论如何,谢谢你的时间 - 祝你万事如意.
@AndreaMoro已过时的是pyvenv,而不是pyenv。容易混淆这些工具的名称。
`add2virtualenv`通过在`site-packages`下添加一个自定义`_virtualenv_path_extensions.pth`文件来调整你的'PYTHONPATH`.或者,您可以更新每次激活虚拟环境时调用的`bin/activate`文件中的`PYTHONPATH`环境变量.或者你可以在`site-packages`下添加符号链接指向额外的目录.这两种替代方案对于开发人员广泛用于排除故障的传统命令行工具更加透明.使用带有未记录名称的自定义`.pth`使其看起来更加神奇IMO.
编辑"PYTHONPATH"必须正常工作,请参阅/sf/ask/17360801/.如果你遇到问题发布评论,我会为你排除故障.`PYTHONPATH`获取*父文件夹*的路径,而不是模块本身.如果您遇到问题,请参阅此问题/sf/ask/17360801/(或手册!https://docs.python.org/3/using/cmdline.html# ENVVAR-PYTHONPATH)
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有