Fli*_*imm 800 python virtualenv virtualenvwrapper python-venv pyenv
Python 3.3在其标准库中包含了新包venv
.它做了什么,它与所有其他似乎与正则表达式相匹配的包有什么不同(py)?(v|virtual|pip)?env
?
Fli*_*imm 1134
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以及各种情况的工具开始,一旦你开始需要它们,就拿起其他工具.
Ria*_*zvi 213
我只是避免使用virtualenv
Python3.3 +之后使用标准的附带库venv
.要创建新的虚拟环境,您可以键入:
$ python3 -m venv <MYVENV>
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
因此,我会避免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
.
F1L*_*nux 77
在“结论”段落下方添加
我已经进入了pipenv
兔子洞(它确实是一个又深又黑的洞......)并且由于最后一个答案是在 2 年前,我觉得用 Python 虚拟信封主题的最新发展更新讨论很有用我找到了
这个答案不是要继续关于pipenv 与 venv作为信封解决方案的优点的激烈辩论 -我不认可任何一个。这是关于PyPA认可相互冲突的标准,以及virtualenv 的未来发展如何承诺完全否定在它们之间做出一个/或一个选择。我之所以专注于这两个工具,正是因为它们是PyPA 的恩膏。
正如 OP 所指出的,venv是一种用于虚拟化环境的工具。不是第三方解决方案,而是本机工具。PyPA支持venv来创建虚拟环境:“在 3.5 版中更改:现在建议使用 venv 来创建虚拟环境”。
pipenv - 与venv类似- 可用于创建虚拟信封,但另外还包含包管理和漏洞检查功能。而不是使用requirements.txt
,pipenv
通过Pipfile提供包管理。由于PyPA支持 pipenv 用于PACKAGE MANAGEMENT,这似乎意味着pipfile
要取代requirements.txt
.
然而:pipenv使用virtualenv作为其创建虚拟信封的工具,而不是 venv,它被PyPA认可为创建虚拟信封的首选工具。
因此,如果确定虚拟信封解决方案还不够困难,我们现在让PyPA支持两种使用不同虚拟信封解决方案的不同工具。Github 关于venv 与 virtualenv的激烈争论突出了这种冲突,可以在这里找到。
上面链接中引用的 Github 辩论将virtualenv 的开发导向了在未来版本中适应venv的方向:
更喜欢内置的 venv:如果目标 python 有 venv,我们将使用它创建环境(然后对其执行后续操作以促进我们提供的其他保证)
因此,看起来这两个竞争对手的虚拟信封解决方案之间未来会有一些融合,但截至目前,使用的pipenvvirtualenv
与venv
.
考虑到pipenv解决的问题以及PyPA的祝福,它似乎有着光明的未来。如果virtualenv实现其提议的开发目标,则选择虚拟信封解决方案不应再是pipenv或venv 的情况。
我在进行此分析时看到的对Pipenv 的反复批评是它没有得到积极维护。事实上,使用一个未来可能因缺乏持续开发而受到质疑的解决方案有什么意义?经过大约 18 个月的干旱期,Pipenv再次得到积极开发。实际上,此后已经发布了大量重要的更新。
Lie*_*yan 32
让我们从这些工具想要解决的问题开始:
我的系统包管理器没有我想要的 Python 版本,或者我想并排安装多个 Python 版本、Python 3.9.0 和 Python 3.9.1、Python 3.5.3 等
然后使用pyenv。
我想安装和运行多个具有不同的、相互冲突的依赖项的应用程序。
然后使用 virtualenv 或 venv。它们几乎完全可以互换,不同之处在于 virtualenv 支持较旧的 python 版本并具有一些更小的独特功能,而 venv 在标准库中。
我正在开发一个 /application/ 并且需要管理我的依赖项,并管理我的项目的依赖项的依赖项解析。
然后使用 pipenv 或诗歌。
我正在开发 /library/ 或 /package/ 并想指定我的库用户需要安装的依赖项
然后使用设置工具。
我使用了 virtualenv,但我不喜欢 virtualenv 文件夹分散在各种项目文件夹中。我想要集中管理环境和一些简单的项目管理
然后使用 virtualenvwrapper。变体: pyenv-virtualenvwrapper 如果您也使用 pyenv。
不建议
Arn*_*uld 17
2020 年 1 月更新
@Flimm 很好地解释了所有差异。一般来说,我们想知道所有工具之间的区别,因为我们想决定什么最适合我们。那么,下一个问题是:使用哪个?我建议您选择两种官方方式之一来管理虚拟环境:
pipenv想要结合所有,除了以前它安装“要求”(进入活动的虚拟环境或创建自己的,如果没有活动)
所以也许你只会对 pipenv 感到满意。
但我使用: pyenv + pyenv-virtualenvwrapper, + pipenv (pipenv 仅用于安装要求)。
在 Debian 中:
apt install libffi-dev
基于https://www.tecmint.com/pyenv-install-and-manage-multiple-python-versions-in-linux/安装 pyenv ,但是..
.. 但不是 pyenv-virtualenv 安装 pyenv-virtualenvwrapper (可以是独立库或 pyenv 插件,这里是第二个选项):
$ 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
Run Code Online (Sandbox Code Playgroud)
然后为您的项目创建虚拟环境(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>
Run Code Online (Sandbox Code Playgroud)
并在项目之间切换:
workon <venvname>
python -m pip install --upgrade pip setuptools wheel pipenv
Run Code Online (Sandbox Code Playgroud)
在一个项目中,我有一个文件 requirements.txt,没有修复里面的版本(如果不需要某些版本限制)。您有 2 个可能的工具可以将它们安装到当前的虚拟环境中:pip-tools或pipenv。假设您将使用 pipenv:
pipenv install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
这将创建 Pipfile 和 Pipfile.lock 文件,固定版本在第二个。如果你想在某个地方重新安装完全相同的版本(Pipfile.lock 必须存在):
pipenv install
Run Code Online (Sandbox Code Playgroud)
请记住,Pipfile.lock 与某个 Python 版本相关,如果您使用不同的版本,则需要重新创建。
如你所见,我写了 requirements.txt。这有一些问题:您也必须从 Pipfile 中删除已删除的包。所以直接写 Pipfile 可能会更好。
所以你可以看到我使用 pipenv 非常糟糕。也许如果你用好它,它可以取代一切?
编辑 2021.01:我已将堆栈更改为:pyenv + pyenv-virtualenvwrapper + poetry
。IE。我没有使用 virtualenv 或 virtualenvwrapper 的 apt 或 pip 安装,而是安装了pyenv
的 plugin pyenv-virtualenvwrapper
。这是更简单的方法。
Poetry
对我来说很棒:
poetry add <package> # install single package
poetry remove <package>
poetry install # if you remove poetry.lock poetry will re-calculate versions
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
160625 次 |
最近记录: |