venv,pyvenv,pyenv,virtualenv,virtualenvwrapper,pipenv等有什么区别?标准库中没有的 PyPI 包:标准库:

Python 3.3在其标准库中包含了新的包。它有什么作用,它与与正则表达式匹配的所有其他软件包有何不同?venv(py)?(v|virtual|pip)?env


答案 1

这是我个人对初学者的建议:从学习virtualenvpip开始,这些工具可以与Python 2和3一起使用,并且在各种情况下都可以使用,并在开始需要它们时选择其他工具。

现在来回答这个问题:这些被虚构命名的东西有什么区别:venv,virtualenv等?

标准库中没有的 PyPI 包:

  • virtualenv是一个非常流行的工具,它为Python库创建隔离的Python环境。如果您不熟悉此工具,我强烈建议您学习它,因为它是一个非常有用的工具。

    它的工作原理是在目录中安装一堆文件(例如:),然后修改环境变量以在其前面加上自定义目录(例如:)。或二进制文件的精确副本被放置在此目录中,但Python被编程为首先在环境目录中查找相对于其路径的库。它不是Python标准库的一部分,但得到了PyPA(Python打包管理局)的正式祝福。激活后,您可以使用 在虚拟环境中安装软件包。env/PATHbinenv/bin/pythonpython3pip

  • pyenv用于隔离Python版本。例如,您可能希望针对 Python 2.7、3.6、3.7 和 3.8 测试代码,因此您需要一种在它们之间切换的方法。激活后,它会在环境变量前面加上 前缀,其中有与 Python 命令 (, ) 匹配的特殊文件。这些不是Python附带的命令的副本;它们是特殊的脚本,可以根据环境变量、文件或文件动态决定运行哪个版本的 Python。 还使下载和安装多个Python版本的过程更加容易,使用命令。PATH~/.pyenv/shimspythonpipPYENV_VERSION.python-version~/.pyenv/versionpyenvpyenv install

  • pyenv-virtualenv 是一个由 同一作者提供的插件,允许您同时方便地使用。但是,如果您使用的是 Python 3.3 或更高版本,则会尝试运行(如果可用),而不是 .如果您不想要便利功能,则可以在没有 的情况下一起使用 和 一起使用。pyenvpyenvpyenvvirtualenvpyenv-virtualenvpython -m venvvirtualenvvirtualenvpyenvpyenv-virtualenv

  • virtualenvwrapper 是一组扩展(参见 docs)。它为您提供了像 、 这样的命令,特别是用于在不同目录之间切换。如果您想要多个目录,此工具特别有用。virtualenvmkvirtualenvlssitepackagesworkonvirtualenvvirtualenv

  • pyenv-virtualenvwrapper 是一个插件,由同一作者提供,用于方便地集成到 .pyenvpyenvvirtualenvwrapperpyenv

  • pipenv 旨在将 , 并组合成一个命令行命令。该目录通常被放置在 中,是项目目录路径的哈希值。这与 不同,在 当前工作目录中,目录通常位于 当前工作目录中。 旨在开发Python应用程序(而不是库)时使用。有 替代方法,例如 ,我不会在这里列出,因为这个问题只是关于名称相似的包。Pipfilepipvirtualenvvirtualenv~/.local/share/virtualenvs/XXXXXXvirtualenvpipenvpipenvpoetry

标准库:

  • pyvenv(不要与上一节中的pyenv混淆)是Python 3.3到3.7附带的脚本。它从Python 3.8中删除,因为它有问题(更不用说令人困惑的名称了)。运行具有与 完全相同的效果。python3 -m venvpyvenv

  • venv是Python 3附带的软件包,您可以使用它运行(尽管由于某种原因,一些发行版将其分离到一个单独的发行版包中,例如在Ubuntu / Debian上)。它的用途与 相同,但只有其功能的子集(请参阅此处的比较)。 继续比 更受欢迎,特别是因为前者同时支持 Python 2 和 3。python3 -m venvpython3-venvvirtualenvvirtualenvvenv


答案 2

我只是避免使用Python3.3 +之后,而是使用标准附带的库。要创建新的虚拟环境,请键入:virtualenvvenv

$ 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)

因此,我会避免和. 已弃用。 似乎经常在使用的地方使用,但我会远离它,因为我认为也做了为之而构建的东西。virtualenvwrapperpipenvpyvenvpyenvvirtualenvvenvpyenv

venv在 shell 中创建全新的沙盒虚拟环境,具有用户可安装的库,并且它是多 python 安全的

新鲜:由于虚拟环境仅从python附带的标准库开始,因此您必须在虚拟环境处于活动状态时重新安装任何其他库。pip install

沙盒化:因为这些新库安装在虚拟环境之外都不可见,因此您可以删除整个环境并重新开始,而不必担心影响基本python安装。

用户可安装的库:由于虚拟环境的目标文件夹是在您已经拥有的某个目录中创建的,因此您不需要将库安装到其中的权限。sudosudo

多python安全:因为当虚拟环境激活时,shell只能看到用于构建该虚拟环境的python版本(3.4,3.5等)。

pyenv类似于它允许您管理多个python环境。但是,您无法方便地将库安装回滚到某些启动状态,并且您可能需要在某些时候具有更新库的权限。所以我认为最好使用.venvpyenvadminvenv

在过去的几年中,我发现构建系统(emacs包,python独立应用程序构建器,安装程序等)中存在许多问题,这些问题最终归结为.我认为当我们消除这个额外的选项并仅使用时,python将是一个更好的平台。virtualenvvenv

编辑:BDFL的推文,

我使用venv(在stdlib中)和一堆shell别名来快速切换。

—圭多·范·罗苏姆(@gvanrossum)2020年10月22日