Python 3.3在其标准库中包含了新的软件包venv。它做什么,它与所有其他匹配regex(py)的包有何不同?(v|virtual|pip)?环境?


当前回答

这是我对初学者的个人建议:首先学习virtualenv和pip,这两种工具可以在Python 2和3以及各种情况下使用,一旦您开始需要它们,就可以选择其他工具。

现在来回答这个问题:这些名称相似的东西之间有什么区别:venv、virtualenv等?

不在标准库中的PyPI包:

virtualenv是一个非常流行的工具,它为Python库创建独立的Python环境。如果你不熟悉这个工具,我强烈建议你学习它,因为它是一个非常有用的工具。它的工作方式是在一个目录中安装一堆文件(例如:env/),然后修改PATH环境变量,以在其前面加上一个自定义bin目录(例如:nv/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版本文件或~/.PYENV/version文件随时决定运行哪个版本的Python。pyenv还使用命令pyenv install使下载和安装多个Python版本的过程更容易。pyenvvirtualenv是pyenv的一个插件,与pyenv作者相同,可以方便地同时使用pyenv和virtualenv。然而,如果您使用的是Python 3.3或更高版本,pyenv virtualenv将尝试运行Python-m venv(如果可用),而不是virtualenv。如果您不想使用方便的特性,可以在不使用pyenv virtualenv的情况下同时使用virtualenv和pyenv。virtualvwrapper是virtualenv的一组扩展(参见文档)。它为您提供了mkvirtualenv、lssitepackages等命令,尤其是在不同virtualenv目录之间切换的工作。如果您需要多个virtualenv目录,此工具特别有用。pyenv virtualenvwrapper是pyenv的一个插件,与pyenv作者相同,可以方便地将virtualnvwrapper集成到pyenv中。pipenv旨在将Pipfile、pip和virtualenv组合成命令行上的一个命令。virtualenv目录通常放在~/.local/share/virtalenvs/XXX中,其中XXX是项目目录路径的哈希。这与virtualenv不同,virtualenv中的目录通常位于当前工作目录中。pipenv用于开发Python应用程序(而不是库)。pipenv还有其他选择,例如诗歌,我不会在这里列出,因为这个问题只涉及名称类似的包。

标准库:

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更受欢迎,特别是因为前者同时支持Python2和3。

其他回答

pyenv-管理不同的python版本,所有其他-创建虚拟环境(它隔离了python版本和安装的“要求”),

pipenv希望合并所有内容,除了之前的内容,它还将“需求”安装到活动虚拟环境中或创建自己的如果没有激活)

所以也许你只会对pipenv感到高兴。

但我使用:pyenv+pyenv virtualenvwrapper,+pipenv(pipenv仅用于安装需求)。

在Debian中:

apt安装libffi-dev安装pyenv基于https://www.tecmint.com/pyenv-install-and-manage-multiple-python-versions-in-linux/但是..而不是pyenv virtualenv安装pyenv虚拟vwrapper(它可以是独立的库或pyenv插件,这里是第二个选项):$pyenv安装3.9.0$git克隆https://github.com/pyenv/pyenv-virtualenvwrapper.git$(pyenv根)/plugins/pyenv虚拟vwrapper#在~/.bashrc中添加:#export$VIRTUALENVRAPPER_PYTHON=“/usr/bin/python3”$source~/.bashrc$pyenv虚拟vwrapper

然后为项目创建虚拟环境(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,但没有修复其中的版本(如果不需要某些版本限制)。您有两种可能的工具将它们安装到当前虚拟环境中:pip工具或pipenv。假设您将使用pipenv:

pipenv install -r requirements.txt

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

pipenv install

请记住,Pipfile.lock与某些Python版本相关,如果使用其他版本,则需要重新创建。

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

所以你可以看到我用pipenv很差。也许如果你好好使用它,它可以取代一切?

编辑2021.01:我已将堆栈更改为:pyenv+pyenv virtualenvwrapper+poetry。我没有使用apt或pip安装virtualenv或virtualvwrapper,而是安装pyenv的插件pyenv virtualvwrappr。这是比较容易的方法。

诗歌对我来说很棒:

poetry add <package>   # install single package
poetry remove <package>
poetry install   # if you remove poetry.lock poetry will re-calculate versions

我想将docker添加到这个列表中,以及几个答案已经提到的conda。

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

docker甚至更好,它为您提供了一个全新的操作系统。有了一个好的Dockerfile和一个docker构建、docker运行脚本,您就可以很好地记录环境是如何构建的,并且很容易填充、迁移到其他环境(登台、生产、云)。从长远来看,它会帮助你。

另一件事:PyCharm提供了几个选项来选择您的虚拟环境。这有助于新来者不必担心这件事。建议在了解虚拟环境是什么之前使用它。

2020年1月更新

@Flimm很好地解释了所有的差异。通常,我们想知道所有工具之间的区别,因为我们想决定什么对我们最有利。所以,下一个问题是:使用哪一个?我建议您选择两种管理虚拟环境的官方方式之一:

Python Packaging现在推荐PipenvPython.org现在推荐venv

更新20200825:

在以下“结论”段落中添加

我去过pipenv兔子洞(这确实是一个又深又暗的洞……),由于上一个答案是两年前的事,我觉得用我发现的Python虚拟信封主题的最新发展来更新讨论是很有用的。

免责声明:

这个答案并不是要继续关于pipenv和venv作为包络解决方案的优点的激烈辩论,我也不赞成。这是关于PyPA认可相互冲突的标准,以及virtualenv的未来发展将如何否定在两者之间做出非此即彼的选择。我专注于这两个工具,正是因为它们是PyPA的受膏工具。

venv

正如OP所指出的,venv是一种虚拟化环境的工具。不是第三方解决方案,而是本地工具。PyPA支持venv创建虚拟环境:“在3.5版中进行了更改:现在建议使用venv来创建虚拟环境”。

管道女

pipenv(类似于venv)可以用于创建虚拟信封,但还可以添加包管理和漏洞检查功能。pipenv通过Pipfile提供包管理,而不是使用requirements.txt。由于PyPA认可pipenv用于包管理,这似乎意味着pipfile将取代requirements.txt。

然而:pipenv使用virtualenv作为创建虚拟信封的工具,而不是由PyPA认可的venv作为创建虚拟封套的工具。

冲突标准:

因此,如果确定虚拟信封解决方案还不够困难,我们现在让PyPA认可两种不同的工具,它们使用不同的虚拟信封解决。Github关于venv vs virtualenv的激烈辩论突显了这一冲突,这一点可以在这里找到。

冲突解决:

上述链接中提到的Github辩论将virtualenv开发引向了在未来版本中适应venv的方向:

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

结论:

因此,这两个竞争对手的虚拟信封解决方案之间似乎会有一些未来的融合,但到目前为止,使用virtualenv的pipenv与venv有很大的不同。

考虑到pipenv解决的问题以及PyPA给予的祝福,它似乎有一个光明的未来。如果virtualenv实现了其提出的开发目标,那么选择虚拟信封解决方案就不再是pipenv或venv的问题。

更新20200825:

我在进行这项分析时看到,对Pipenv的一个经常重复的批评是它没有得到积极维护。事实上,使用一个因缺乏持续发展而前途堪忧的解决方案有什么意义?在经历了大约18个月的干旱期后,Pipenv再次被积极开发。事实上,此后发布了大量重要更新。

这是我对初学者的个人建议:首先学习virtualenv和pip,这两种工具可以在Python 2和3以及各种情况下使用,一旦您开始需要它们,就可以选择其他工具。

现在来回答这个问题:这些名称相似的东西之间有什么区别:venv、virtualenv等?

不在标准库中的PyPI包:

virtualenv是一个非常流行的工具,它为Python库创建独立的Python环境。如果你不熟悉这个工具,我强烈建议你学习它,因为它是一个非常有用的工具。它的工作方式是在一个目录中安装一堆文件(例如:env/),然后修改PATH环境变量,以在其前面加上一个自定义bin目录(例如:nv/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版本文件或~/.PYENV/version文件随时决定运行哪个版本的Python。pyenv还使用命令pyenv install使下载和安装多个Python版本的过程更容易。pyenvvirtualenv是pyenv的一个插件,与pyenv作者相同,可以方便地同时使用pyenv和virtualenv。然而,如果您使用的是Python 3.3或更高版本,pyenv virtualenv将尝试运行Python-m venv(如果可用),而不是virtualenv。如果您不想使用方便的特性,可以在不使用pyenv virtualenv的情况下同时使用virtualenv和pyenv。virtualvwrapper是virtualenv的一组扩展(参见文档)。它为您提供了mkvirtualenv、lssitepackages等命令,尤其是在不同virtualenv目录之间切换的工作。如果您需要多个virtualenv目录,此工具特别有用。pyenv virtualenvwrapper是pyenv的一个插件,与pyenv作者相同,可以方便地将virtualnvwrapper集成到pyenv中。pipenv旨在将Pipfile、pip和virtualenv组合成命令行上的一个命令。virtualenv目录通常放在~/.local/share/virtalenvs/XXX中,其中XXX是项目目录路径的哈希。这与virtualenv不同,virtualenv中的目录通常位于当前工作目录中。pipenv用于开发Python应用程序(而不是库)。pipenv还有其他选择,例如诗歌,我不会在这里列出,因为这个问题只涉及名称类似的包。

标准库:

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更受欢迎,特别是因为前者同时支持Python2和3。