Python 3.3 在其标准库中包括新的软件包venv
。它有什么作用?与似乎与正则表达式(py)?(v|virtual|pip)?env
匹配的所有其他软件包有什么不同(py)?(v|virtual|pip)?env
?
virtualenv
是一种非常流行的工具,可以为 Python 库创建隔离的 Python 环境。如果您不熟悉此工具,我强烈建议您学习它,因为它是非常有用的工具,在本答案的其余部分中,我将对其进行比较。
它的工作方式是在目录中安装一堆文件(例如: env/
),然后修改PATH
环境变量以在其前面添加自定义bin
目录(例如: env/bin/
)。 python
或python3
二进制文件的精确副本放置在此目录中,但 Python 编程为在环境目录中首先查找与其路径相关的库。它不是 Python 标准库的一部分,但是受到 PyPA(Python 包装管理局)的正式祝福。激活后,您可以使用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
还可以使用pyenv install
命令pyenv install
下载和安装多个 Python 版本的过程。
pyenv-virtualenv
是pyenv
的同一作者的pyenv
,可让您方便地同时使用pyenv
和virtualenv
。但是,如果您使用的是 Python 3.3 或更高版本,则pyenv-virtualenv
将尝试运行python -m venv
如果可用),而不是virtualenv
。如果您不希望使用便捷功能,则可以将virtualenv
和pyenv
一起使用,而无需使用pyenv-virtualenv
。
virtualenvwrapper
是一组扩展的virtualenv
(参见文档 )。它为您提供mkvirtualenv
, lssitepackages
等命令,尤其是在不同的virtualenv
目录之间切换的workon
。如果要多个virtualenv
目录,此工具特别有用。
pyenv-virtualenvwrapper
是pyenv
的同一作者的pyenv
,可方便地将virtualenvwrapper
集成到pyenv
。
Kenneth Reitz( requests
的作者)的pipenv
是该列表中的最新项目。它旨在将Pipfile
, pip
和virtualenv
为命令行上的一个命令。通常将virtualenv
目录放置在~/.local/share/virtualenvs/XXX
,其中XXX
是项目目录路径的哈希。这与virtualenv
不同,后者的目录通常位于当前工作目录中。
《 Python 打包指南》 建议在开发 Python 应用程序(而不是库)时使用pipenv
。似乎没有任何计划支持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 -m venv
(尽管出于某些原因,某些发行版将其分成了单独的发行版软件包,例如 Ubuntu / Debian 上的python3-venv
)。它的作用与virtualenv
相似,并且工作方式非常相似,但是不需要复制 Python 二进制文件(Windows 除外)。如果您不需要支持 Python 2,请使用它。在撰写本文时,Python 社区似乎对virtualenv
感到满意,并且我还没有听到太多有关venv
。
这些工具大多相互补充。例如,如果需要, pipenv
集成了pip
, virtualenv
甚至pyenv
。 venv
和virtualenv
是彼此真正替代的唯一工具。
这是我对初学者的个人建议:首先学习virtualenv
和pip
,这些工具在各种情况下virtualenv
与 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
,因此我也不pyenv
。
venv
使用用户可安装的库在外壳中创建全新的 , 沙盒化的虚拟环境,并且它是多 Python 安全的 。 新鲜 ,因为虚拟环境只能用标准库启动船舶与蟒蛇,你必须与各地重新安装任何其他库pip install
在虚拟环境是积极的。 沙盒化是因为这些新库安装在虚拟环境之外都不可见,因此您可以删除整个环境并重新启动,而不必担心会影响基本的 python 安装。 用户可安装的库,因为在您已经拥有的某个目录中创建了虚拟环境的目标文件夹而没有sudo
,因此您不需要sudo
权限即可将库安装到其中。最后,它是多 python 安全的 ,因为在激活虚拟环境时,shell 仅看到用于构建该虚拟环境的 python 版本(3.4、3.5 等)。
pyenv
类似于venv
,它可以让你管理多个蟒蛇环境。但是,使用pyenv
您无法方便地将库安装回滚到某些开始状态,并且在某些时候可能需要admin
权限才能更新库。所以我认为最好还是使用venv
。
在过去的两年中,我发现了构建系统中的许多问题(emacs 软件包,python 独立应用程序构建器,安装程序...),最终归结为virtualenv
问题。我认为当我们取消此附加选项并且仅使用venv
时,python 将是一个更好的平台。