Python 3.3在其标准库中包含了新软件包venv
。它有什么作用?与似乎与regex匹配的所有其他软件包(py)?(v|virtual|pip)?env
有何不同?
virtualenv
和pyenv
不会执行相同的功能,并且不能互相替代。看我的答案。
Python 3.3在其标准库中包含了新软件包venv
。它有什么作用?与似乎与regex匹配的所有其他软件包(py)?(v|virtual|pip)?env
有何不同?
virtualenv
和pyenv
不会执行相同的功能,并且不能互相替代。看我的答案。
Answers:
virtualenv
是一个非常流行的工具,可为Python库创建隔离的Python环境。如果您不熟悉此工具,我强烈建议您学习它,因为它是非常有用的工具,在本答案的其余部分中,我将对其进行比较。
它的工作方式是在目录(例如:)中安装一堆文件env/
,然后修改PATH
环境变量以在其之前添加自定义bin
目录(例如:)env/bin/
。在完全相同的副本python
或python3
二进制文件放在这个目录中,但是Python编程寻找相对于其路径优先库,环境中的目录。它不是Python标准库的一部分,但是受到PyPA(Python包装管理局)的正式认可。激活后,您可以使用在虚拟环境中安装软件包pip
。
pyenv
用于隔离Python版本。例如,您可能想针对Python 2.7、3.6、3.7和3.8测试代码,因此需要一种在它们之间切换的方法。一旦被激活,它的前缀PATH
与环境变量~/.pyenv/shims
,那里有专用的文件相匹配的Python命令(python
,pip
)。这些不是Python附带命令的副本。它们是特殊的脚本,它们可以根据PYENV_VERSION
环境变量,.python-version
文件或~/.pyenv/version
文件即时确定要运行哪个版本的Python 。pyenv
使用命令,还可以简化下载和安装多个Python版本的过程pyenv install
。
pyenv-virtualenv
是一个插件pyenv
由同一作者的pyenv
,允许你使用pyenv
和virtualenv
在同一时间方便。但是,如果您使用的是Python 3.3或更高版本,请pyenv-virtualenv
尝试运行python -m venv
它(如果有),而不是virtualenv
。如果您不希望使用便利功能,则可以在不使用的情况下一起使用virtualenv
和。pyenv
pyenv-virtualenv
virtualenvwrapper
是virtualenv
(参见docs)的一组扩展。它为您提供诸如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
是Python 3附带的脚本,但由于存在问题(更不用说混乱的名称了)而在Python 3.6中不推荐使用。在Python 3.6及更高版本中,确切的等效项是python3 -m venv
。
venv
是Python 3附带的软件包,您可以使用它运行python3 -m venv
(尽管出于某些原因,某些发行版将其分成了单独的发行版软件包,例如python3-venv
在Ubuntu / Debian上)。它的作用与相同virtualenv
,但仅具有部分功能(请参见此处的比较)。virtualenv
继续比受欢迎venv
,尤其是因为前者同时支持Python 2和3。
这是我对初学者的个人建议:首先学习virtualenv
和pip
,这些工具可在各种情况下与Python 2和3一起使用,并在需要时选择其他工具。
venv
实际上解决了这个问题吗?
venv
您可以更轻松地升级到新的Python版本。
我只是避免virtualenv
在Python3.3 +之后使用,而是使用标准附带的库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)
因此,我会避免virtualenvwrapper
和pipenv
。pyvenv
不推荐使用。pyenv
似乎是经常使用的地方virtualenv
使用,但我会远离它也因为我觉得venv
还做什么pyenv
是对建。
venv
使用用户可安装的库在外壳中创建新的和沙盒化的虚拟环境,并且它是多Python安全的。新鲜的,因为虚拟环境只能用标准库启动船舶与蟒蛇,你必须与各地重新安装任何其他库,而虚拟环境是积极的。沙盒化,因为在虚拟环境外部看不到这些新库安装,因此您可以删除整个环境并重新启动,而不必担心会影响基本的python安装。用户可安装的库,因为创建虚拟环境的目标文件夹时没有pip install
sudo
在您已经拥有的某个目录中,因此您不需要sudo
权限就可以在其中安装库。最终,它是多python安全的,因为在激活虚拟环境时,shell仅看到用于构建该虚拟环境的python版本(3.4、3.5等)。
pyenv
类似于venv
,它可以让您管理多个python环境。但是,pyenv
由于无法方便地将库安装回滚到某些开始状态,因此您admin
有时可能需要特权来更新库。所以我认为也最好使用venv
。
在过去的两年中,我发现了构建系统中的许多问题(emacs软件包,python独立应用程序构建器,安装程序...),最终归结为virtualenv
。我认为当我们取消此附加选项并仅使用时,python将是一个更好的平台venv
。
add2virtualenv
PYTHONPATH
通过_virtualenv_path_extensions.pth
在下添加自定义文件来调整您的内容site-packages
。或者,您可以PYTHONPATH
在bin/activate
每次激活虚拟环境时在调用的文件中更新环境变量。或者,您可以在下面添加符号链接site-packages
以指向额外的目录。这两种选择对开发人员广泛用于进行故障排除的传统命令行工具都更加透明。使用.pth
带有未记录名称的自定义名称,使IMO看起来更加神奇。
PYTHONPATH
消除对的需要add2virtualenv
。关于您的第一个评论中对SO的帮助不足,我的唯一建议是,如果他们解决了您的问题,请否决答案,以激励人们在您发帖时为您解决问题?半小时的调查和写作以换取鼠标单击?听起来像是一笔不错的交易……
pyvenv
不赞成使用,而不是pyenv
。容易混淆这些工具的名称。
我掉进了pipenv
兔子洞(的确是个黑洞和黑洞……),因为最后一个答案是两年多以前的,所以觉得有必要用有关Python虚拟信封主题的最新进展来更新讨论非常有用。找到了。
这个答案是不是对继续有关的优点的激烈争论pipenv 与 VENV如信封解决方案- 我并没有任代言。这是关于PyPA赞同冲突的标准,以及如何未来发展的virtualenv承诺否定制造要么/或它们之间选择的话。我专注于这两个工具正是因为它们是PyPA的受膏工具。
如OP所述,venv是用于虚拟化环境的工具。不是第三方解决方案,而是本机工具。PyPA认可venv用于创建虚拟信封:“ 在3.5版中进行了更改:现在建议使用venv创建虚拟环境 ”。
pipenv-像 venv-可以用于创建虚拟信封,但是还可以引入包管理和漏洞检查功能。通过使用 Pipfile交付软件包管理requirements.txt
,而不是使用。当 PyPA认可pipenv用于包管理时,这似乎意味着取代了。pipenv
pipfile
requirements.txt
但是:pipenv使用virtualenv作为创建虚拟信封的工具,而不是 venv,PyPA认可它为创建虚拟信封的必备工具。
因此,如果解决虚拟信封解决方案还不够困难,那么我们现在让PyPA认可使用不同虚拟信封解决方案的两个不同工具。Github关于venv vs virtualenv的激烈辩论可以在这里找到该冲突的重点。
上面链接中提到的Github辩论已经引导了virtualenv的开发,以适应将来的发行版中venv的发展:
首选内置venv:如果目标python拥有venv,我们将使用该环境创建环境(然后对其进行后续操作以促进我们提供的其他保证)
因此,看起来这两个相互竞争的虚拟信封解决方案之间将会有一些未来的融合,但是截至目前,pipenv(使用的)virtualenv
与有所不同venv
。
鉴于pipenv解决的问题以及PyPA给予的祝福,它似乎拥有光明的前景。而且,如果virtualenv实现了其建议的开发目标,那么选择pipenv或venv不再是选择虚拟信封解决方案的理由。
2020年4月更新
当我看到这篇文章时,我正在寻找相同的内容。我认为对于像我这样的新Python用户而言,使用什么工具这个问题非常令人困惑和困难。这直接来自PyPA网站上关于pipenv的信息:
虽然本教程将pipenv项目作为工具主要集中在Python应用程序开发而不是Python库开发上,但该项目本身目前正在解决多个流程和维护问题,这些问题阻止了bug修复和新功能的发布(整个2019年过去了,而没有新版本)。这意味着,在短期内,pipenv仍然会遇到一些怪癖和性能问题,而没有明确解决这些问题的时间表。
尽管情况仍然如此,但项目维护人员可能希望研究其他用于应用程序依赖性管理的工具,以代替pipenv或与之一起使用。
假设2020年4月发布的pipenv按计划进行,此后的发布也仍在进行中,那么该教程中的警告将被删除。如果这些发行版不符合要求,那么教程本身将被删除,并替换为可用的依赖项管理选项上的讨论页。