venv
包。它是做什么的,与所有与正则表达式(py)?(v|virtual|pip)?env
匹配的其他包有何不同?venv
包。它是做什么的,与所有与正则表达式(py)?(v|virtual|pip)?env
匹配的其他包有何不同?以下是我个人推荐给初学者的建议:从学习virtualenv
和pip
开始,这两个工具适用于Python 2和3,并且适用于各种情况。一旦需要其他工具,可以再学习。
接下来回答一个问题:venv、virtualenv等这些同名工具有何不同?
virtualenv
是一个非常流行的工具,可为Python库创建隔离的Python环境。如果您不熟悉此工具,我强烈建议您学习它,因为它是非常有用的工具。
它的工作原理是在目录中安装一堆文件(例如:env/
),然后修改PATH
环境变量以使用自定义bin
目录(例如:env/bin/
)作为前缀。精确复制了python
或python3
二进制文件放在此目录中,但是Python被编程为首先查找环境目录中的库。它不是Python标准库的一部分,但已由PyPA(Python Packaging Authority)正式批准。激活后,您可以使用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
还通过命令 pyenv install
简化了下载和安装多个 Python 版本的过程。
pyenv-virtualenv
是由与 pyenv
同一作者开发的插件,方便您同时使用 pyenv
和 virtualenv
。但是,如果使用的是 Python 3.3 或更高版本,则 pyenv-virtualenv
将尝试运行 python -m venv
(如果可用)而不是 virtualenv
。如果您不需要方便功能,也可以在没有 pyenv-virtualenv
的情况下同时使用 virtualenv
和 pyenv
。
virtualenvwrapper
是 virtualenv
的扩展(请参阅文档),它提供了诸如 mkvirtualenv
、lssitepackages
和特别是 workon
等命令,用于在不同的 virtualenv
目录之间切换。如果您需要多个 virtualenv
目录,则此工具尤其有用。
pyenv-virtualenvwrapper
是 pyenv
的插件,由与 pyenv
相同的作者编写,方便地将 virtualenvwrapper
集成到 pyenv
中。
pipenv
旨在将 Pipfile
、pip
和 virtualenv
组合成一条命令行命令。通常将 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。
在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)
virtualenvwrapper
和pipenv
。 pyvenv
已被弃用。 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日
venv
在虚拟环境中越来越流行,但pyenv
仍然有其优势。我目前可以想到的一个经典理由是,AWS Lambda支持的最高Python运行时版本是3.8,而Python 3.9已经发布,我希望其他非Lambda项目基于3.9。因此,我仍然需要pyenv
来在版本之间切换。使用pyenv-virtualenv
允许用户同时使用pyenv
和venv
(不是virtualenv
)。 - azec-pdxvirtualenvwrapper
有什么问题吗? - user32882$ path/to/python3x -m venv <MYVENVx>
或 $ path/to/python3y -m venv <MYVENVy>
,然后当你激活环境时,你将激活用于创建环境的Python。 - Rian Rizvi在下面添加了“结论”段落
我深入研究了 pipenv
(它确实是一个深而黑暗的洞穴...),因为上一次回答已经超过2年了,所以觉得有必要更新一下关于Python虚拟信封主题的最新进展。
这个回答不是关于继续争论 pipenv 和 venv 作为信封解决方案的优劣之处 - 我对任何一种都不做支持。它关于 PyPA 支持相互冲突的标准以及未来 virtualenv 的发展承诺将消除对它们之间进行 二选一 选择的需求。我专注于这两个工具,正是因为它们是由 PyPA 授权的。
正如OP所指出的,venv是一种用于虚拟化环境的工具。它不是第三方解决方案,而是本地工具。 PyPA认可venv用于创建虚拟封套:"从版本3.5开始更改:现在推荐使用venv来创建虚拟环境"
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,我们将使用它创建环境(然后在此基础上执行后续操作以便提供其他保证)
看起来两个竞争对手的虚拟信封解决方案将会有一些未来的融合,但目前为止,使用pipenv的virtualenv
与venv
存在实质性差异。
考虑到pipenv解决的问题以及PyPA的认可,它似乎有着光明的未来。而如果virtualenv能够实现其提出的开发目标,选择一个虚拟信封解决方案将不再是pipenv或者venv的问题。
在我进行这个分析时,经常听到关于Pipenv的一个批评是它没有得到积极的维护。确实,使用一个未来可能因缺乏持续开发而有问题的解决方案有何意义呢?在大约18个月的干旱期之后,Pipenv再次开始积极开发。的确,自那时以来已经发布了重大的更新released。
pyenv
不是 virtualenv
的替代品。而且这两个东西都不是 pipenv
的替代品。它们做的事情不同。就像 Django、Python 和 PostgreSQL 是不同的东西一样。 - Flimm使用场景 | 解决方案 |
---|---|
我的系统包管理器没有我想要的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。 |
不推荐使用
2020年1月更新
@Flimm已经非常好地解释了所有的区别。总的来说,我们想知道所有工具之间的区别,因为我们想决定哪个是最适合我们的。那么下一个问题就是:该选择哪个?我建议您选择两种官方管理虚拟环境的方式之一:
pipenv
和venv
并不是彼此的替代品,就像Django和Python也不是彼此的替代品。仅使用venv
,您无法安装软件包,而pipenv
提供了一种安装软件包的机制。 - Flimmpython -m venv foo; source foo/bin/activate; pip install numpy
。venv
和pip
都可以直接使用。这个注释听起来有点误导性。 - Magnus Lind Oxlundpip
替换 venv
,反之亦然。你不能执行 venv install numpy
,也不能执行 pip foo; source foo/bin/activate
。因此,我坚持认为它们不是彼此的替代品。另外,在 Ubuntu 安装中,venv
和 pip
都不是开箱即用的(尽管 python3
是开箱即用的)。在 Ubuntu 上,你需要安装 python3-venv
(使用 APT)来获取 venv
,并且你需要单独安装 python3-pip
来获取 pip
。 - Flimmpipenv 希望将所有内容结合起来,除了之前提到的内容外,它还会安装“需求”(在活动虚拟环境中或创建自己的虚拟环境,如果没有活动的虚拟环境)。
因此,也许您只需要用 pipenv 工具就可以了。
但是,我使用 pyenv + pyenv-virtualenvwrapper,再加上 pipenv (仅用于安装需求)。
在 Debian 中:
apt install libffi-dev
install pyenv based on https://www.tecmint.com/pyenv-install-and-manage-multiple-python-versions-in-linux/, but..
.. 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-tools或pipenv。假设您将使用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
pyenv + pyenv-virtualenvwrapper + poetry
,尤其是如何指示 poetry
使用通过 pyenv
安装的特定版本,并且是否禁用了 poetry
中创建虚拟环境的功能? - Yassine Sedrani我想要将docker
加入到这个列表中,并且还有一些答案已经提到的conda
。
conda
比标题提到的虚拟环境更重,它也能隔离一些系统Python工具,例如ffmpeg或gpu驱动程序。
docker
更好,它为您提供了一个全新的操作系统来使用。通过一个良好的Dockerfile和docker build
、docker run
脚本,您可以很好地记录环境是如何构建的,并且很容易进行填充、迁移到其他环境(staging、production、cloud)。它在长期的运行过程中会帮助您。
另外,PyCharm提供了几个选项来选择您的虚拟环境。这有助于新手不用担心这个问题。建议在了解什么是虚拟环境之前使用它。
conda build
,但如果你不是包维护者,那么你必须说服包所有者为每个新版本生成一个conda包(或自己生成)。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包来投资你的职业生涯(长期),而不是短期完成工作,这很重要。然而,这是一个商业分析问题。你是想简单地完成任务,还是想成为一个专业的软件工程师,构建可扩展的高性能系统,需要最少的维护工作量?在我看来,conda比处理pip多样性问题更容易让你达到后者的位置。conda仍然缺少一步pip包迁移工具,使这个问题变得无关紧要。如果我们可以将pip包简单地转换为conda包,那么pypi.org和conda-forge就可以合并。Pip是必需的,因为conda包目前还不是普遍适用的。许多Python程序员要么太懒了,不愿意创建conda包,要么只编写Python代码,不需要conda的语言无关/多语言支持。保持简单!我需要一个能够完成90%需求的软件包,以及对剩余10%边缘情况的指导和解决方案。
请查看此处链接的文章,了解更多关于基于pip的虚拟环境的知识。
希望这对原帖作者有所帮助,并为pip和conda爱好者提供一些思考的方向。
pip
、venv
等工具时不会遇到任何困扰。多年来,我使用这些工具从未感到烦恼。 - Karl Knechtel
venv
存在一些不幸的偏见,而venv
是使用Python 3时应该使用的正确工具。 它应该真正成为列表中的第一个,其次是virtualenv
。 https://docs.python.org/3/library/venv.html - EntangledLoops