Python 3.3在其标准库中包含了新包venv
.它做了什么,它与所有其他似乎与正则表达式相匹配的包有什么不同(py)?(v|virtual|pip)?env
?
virtualenv
是一个非常流行的工具,它为Python库创建了独立的Python环境.如果你不熟悉这个工具,我强烈建议学习它,因为它是一个非常有用的工具,我将在这个答案的其余部分进行比较.
它的工作原理是在目录中安装一堆文件(例如:)env/
,然后修改PATH
环境变量,使其前缀为自定义bin
目录(例如:)env/bin/
.python
或python3
二进制文件的精确副本放在此目录中,但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-virtualenv
是pyenv
同一作者的插件pyenv
,允许您方便地使用pyenv
和virtualenv
同时使用.但是,如果您使用的是Python 3.3或更高版本,pyenv-virtualenv
则会尝试在python -m venv
可用时运行,而不是virtualenv
.您可以使用virtualenv
和pyenv
一起没有pyenv-virtualenv
,如果你不想要的便利功能.
virtualenvwrapper
是一组扩展virtualenv
(见文档).它为您提供了类似的命令mkvirtualenv
,lssitepackages
尤其workon
适用于在不同virtualenv
目录之间切换.如果您需要多个virtualenv
目录,此工具特别有用.
pyenv-virtualenvwrapper
是一个插件pyenv
由同一作者的pyenv
,可以方便地集成virtualenvwrapper
到pyenv
.
pipenv
由Kenneth Reitz(作者requests
)撰写,是该列表中的最新项目.它旨在结合Pipfile
,pip
并virtualenv
为在命令行一个命令.该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
是需要的.这里唯一真正替代的工具是venv
和virtualenv
.
这是我对初学者的个人建议:从学习virtualenv
和pip
使用Python 2和3以及各种情况的工具开始,一旦你开始需要它们,就拿起其他工具.
我只是避免使用virtualenv
Python3.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)
因此,我会避免virtualenvwrapper
和pipenv
.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
.