用于管理虚拟环境的 Python 工具
Python 虚拟环境是“一个独立的目录树,其中包含特定版本的 Python 安装以及一些额外的软件包”(引自官方文档)。
接下来是必备的xkcd漫画:
这个故事告诉我们:在使用 Python 虚拟环境时要有意识、有条理,尽量不要污染系统 Python 环境,否则会变得一团糟。
由于虚拟环境可能造成混乱,因此涌现出了许多工具来帮助管理这些环境。本文将介绍并演示其中的几种。
如何使用本指南
本指南旨在解答各种问题,面向各种受众,反映了我内心深处的各种声音。
- 虚拟环境在实际应用中是如何运作的?请参阅概要
venv。 - 如何使用我选择的工具来管理虚拟环境?阅读完相关内容后,请在目录
venv中找到您的工具,查看简要介绍。(或者在评论中推荐我遗漏的工具!) - 有哪些工具可用于管理虚拟环境?请阅读全文!建议先浏览目录。欢迎在评论区提出批评和建议。
- 哪种工具最适合我?可能是virtualenv、Poetry,或者Conda。我最后才会做出这样的判断。
使用venvPython 中包含的
附注:该
virtualenv命令是本节所述原生命令的“超集”python -m venv。实际上,如果您想要获得更快的速度和更多功能virtualenv,只需将以下内容中virtualenv出现的任何内容替换为原生命令即可。请参阅下方的 virtualenv 使用和安装说明。python -m venv
幸运的是,这venv两个模块pip通常都包含在你的 Python 安装包中。要在目录中创建虚拟环境.venv,请尝试以下操作:
python -m venv .venv
为了更详细地解释一下:使用与你想要在虚拟环境中使用的 Python 版本对应的 Python 可执行文件。它可以python像上面那样命名为 `python`,也可以是 ` python`、 python3`python` python3.8、`python`python3.9甚至是pypy3`python`;你应该明白我的意思。然后告诉它执行venv模块,后面跟着你希望虚拟环境所在的目录名称。如上所示,我通常使用 `python`.venv或为了更清晰地显示,使用 `python` venv。
应该会有一个短暂的停顿,然后会创建一个名为 `<directory_name>` 的新目录,您可以使用 `<directory_name>`或 ` <directory_name>`.venv查看该目录(在 Mac 和 Linux 系统上,由于前缀的存在,该目录将不可见,除非您使用`<directory_name> `)。您可以使用任何您喜欢的目录名称来代替 `<directory_name>`。lsdir.ls -a.venv
如果您看到的是类似“由于 ensurepip 不可用,虚拟环境创建失败”或其他发行版特有的错误信息,请按照给出的说明进行操作,或阅读如何安装pipensurepipvenv。
激活虚拟环境
现在您可以激活虚拟环境了。
source ./venv/bin/activate
或者,在 Windows 系统上:
.\venv\Scripts\Activate.ps1
如果不使用 Bash 或 Powershell,您可以查看./venv/bin或.\venv\Scripts目录,了解 CMD、fish 或 csh 的其他选项。
激活后,命令提示符应更改为以虚拟环境目录名称为前缀。例如:
(.venv) [default command prompt] $
那(.venv)(或者你给它起的任何名字)就是你已激活虚拟环境的标志。重启机器或打开其他 shell 或终端标签页后,它不会保持激活状态。请养成运行激活脚本的习惯。
编辑器/IDE有时会提供管理甚至自动激活虚拟环境的方法。例如, VSCode有相关说明,Atom、Vim、Sublime以及PyCharm也有相应的插件。
激活后,您应该可以尝试类似这样的操作:
(.venv) $ python
>>> import sys
>>> sys.executable
'/home/my_username/sample_python/.venv/bin/python'
>>>
你看,可执行文件是不是在你的虚拟环境目录里?如果虚拟环境没有激活,它sys.executable应该显示类似这样的内容'/usr/bin/python',或者显示类似'C:\\Python38\\python.exe'这样的内容。
在虚拟环境中执行 Python 脚本
您可以通过两种方式执行 Python 脚本:
- 激活虚拟环境,然后运行
python my_script_name.py - 即使不激活,也可以使用虚拟环境中的 Python 运行脚本,例如:
./.venv/bin/python my_script_name.py
停用虚拟环境
要退出虚拟环境,请将其停用,如下所示:
(.venv) $ deactivate
$
安装东西
重新激活虚拟环境,并使用 pip 安装一些程序:
(.venv) $ pip install arrow
需要先安装软件包及其依赖项,然后才能导入和使用该软件包。
您可以注销,暂时不用管 Python,几周后再回来重新激活您的虚拟环境。软件包仍然会安装,但仅限于此虚拟环境,不会影响您的系统 Python 环境或其他虚拟环境。
摧毁虚拟环境
“我的虚拟环境已经无法修复了,”你说?这种情况时有发生。这就是使用虚拟环境的风险所在。该怎么办呢?
把它烧掉。
rm -r .venv
全部都拿走了。希望你还记得包裹清单(你之前pip freeze是不是pip list先执行了某个操作才得到清单的?)
然后按照上述说明重新创建虚拟环境。
virtualenv
virtualenv工具与 非常相似python -m venv。事实上,Python 的venv模块就是基于virtualenv 的。然而,使用virtualenv代替python -m venv有一些显而易见的优势:
virtualenv通常比python -m venvpip像 `sys.py` 、setuptools`sys.py` 和 `sys.py`这样的工具wheel通常更新更及时,并且会缓存数据(因此性能有所提升)。从virtualenv某种意义上说,这些是种子包。当然,你也可以添加其他种子包。
virtualenv用法
一些不错的virtualenv命令:
virtualenv --help最后,它会告诉你配置文件应该放在哪里,以防你想设置一个通用配置。virtualenv --upgrade-embed-wheels将会把所有种子包(如pip、 等)更新到最新版本。
否则,请按照上述说明进行操作venv,但使用virtualenv代替python -m venv。
virtualenv安装
您或许可以virtualenv从软件包管理器的存储库中安装(例如,使用apt或)。dnf
但我强烈推荐使用pipxpipx。您可以阅读我关于 pipx 的文章“如何安装 Python 命令行工具或脚本? ”,其中包含解释和说明。
安装完成后pipx,您应该能够:
pipx install virtualenv
诗
virtualenv它们既实用又简单,而且venv各方面功能都很出色。Poetry是另一个便捷的工具,不仅可以用于管理虚拟环境,还可以用于项目和依赖关系管理。
欢迎阅读我的 Poetry 项目管理入门指南,以便开始使用该工具。
与Pipenv一样,Python 文档几乎是官方推荐 Poetry。在“管理应用程序依赖项”教程(本身就是 Pipenv 的使用指南)中写道,我们“也应该考虑使用Poetry项目作为替代的依赖项管理解决方案”。
有了如此高的评价,让我们来尝试一下诗歌吧。
诗歌装置
您可以按照我的 Poetry 入门教程或官方文档来安装 Poetry。
决定诗歌将虚拟环境放置在哪里
默认情况下,Poetry 会将虚拟环境集中安装到一个位置。如果您不希望项目目录中充斥着虚拟环境目录(换句话说,如果您不希望在项目中看到 `<virtual-environment-name>`venv或 `<virtual-environment-name> ` 目录),那么这种方式非常方便。.venv
如果你和我一样更倾向于传统方式,希望将虚拟环境文件放在.venv每个项目的单独目录中,可以试试这个方法:
poetry config virtualenvs.in-project true
与诗歌虚拟环境互动
诗歌是为项目管理而生的,所以要创建一个新的虚拟环境,首先要创建项目目录并进入该目录:
poetry new my_project
cd my_project
首次需要虚拟环境时,系统会自动创建。
激活虚拟环境:
poetry shell
要退出此虚拟环境,请使用 `quit` 命令退出exit,Ctrl-d或者使用您喜欢的任何方式退出 shell。
无需先进入虚拟环境,即可使用该命令执行环境中可用的任何命令poetry run。例如:
poetry run python
添加包含诗歌的软件包
与传统方法不同,使用 Poetry 时,我们不应该使用 `.`pip install来安装软件包。而应该使用 ` poetry add.`
poetry add arrow
上述操作将安装 arrow 并将其记录为pyproject.toml文件中的依赖项。
Pipenv
有趣的是,官方的Python“安装软件包”教程明确指出“直接管理多个虚拟环境可能会变得很繁琐,所以……”,然后提到了Pipenv。
尽管有这种近乎官方的推荐,但我仍然使用Poetry,virtualenv因为它稳定且简单,因为它提供了出色的项目和依赖项管理。
话虽如此,Pipenv 已经流行了一段时间,值得关注和尊重。如果你喜欢它,那也是有充分理由的。
安装 Pipenv
虽然Pipenv 文档建议使用 pip 或其他包管理器,但我强烈建议使用pippipx来安装 Pipenv。您可以在这里阅读更多关于安装和使用的信息pipx。然后……
pipx install pipenv
与 Pipenv 的虚拟环境进行交互
使用 Pipenv 时,首先创建项目目录非常重要。(实际上,使用任何工具时,这都是一个好习惯。)
首次需要虚拟环境时,系统会自动创建。
激活虚拟环境:
pipenv shell
要退出此虚拟环境,请使用 `quit` 命令退出exit,Ctrl-d或者使用您喜欢的任何方式退出 shell(如果您尝试过上面的Poetry命令,这一切应该会感觉有点熟悉)。
无需先进入虚拟环境,即可使用该命令执行环境中可用的任何命令pipenv run。例如:
pipenv run python
使用 Pipenv 安装软件包
pip installPipenv不使用 . 来安装软件包,而是使用pipenv install.
pipenv install arrow
上述操作将在Pipfile当前目录中安装 arrow 并将其记录为依赖项。
Pyflow
我承认我喜欢崭新闪亮的东西。在这方面,我有点像个喜鹊。
如果你问我有什么推荐的工具可以轻松创建虚拟环境,我会询问你的项目和需求,然后通常会建议virtualenv或Poetry。
但如果你想尝试一些略显冷门但很有前途的东西,尤其是在处理不同 Python 版本的情况下,那么Pyflow应该会很有趣。你可以把它想象成 Poetry 的简化版,加上简洁的 Python 版本管理,借鉴conda 的理念,然后用Rust编写整个程序,它看起来就有点像 Pyflow 了。Pyflow 能否成熟并获得社区的认可,还有待时间检验;就目前而言,我偶尔会试用一下,感觉很不错。
安装 Pyflow
要安装 Pyflow,请访问Pyflow 发布页面,下载并安装适合您平台的软件包。更多详情请参阅Pyflow 的安装说明。
与 Pyflow 的虚拟环境交互
要使用 Pyflow 创建一个新的虚拟环境,首先需要创建项目:
pyflow new my_project
Pyflow 的一个独特之处在于:它会提示你输入 Python 版本。此外,如果你指定的版本尚未安装,它会自动为你安装,而且速度相当快(不像pyenv那样从头开始编译)。
然后将这个新目录设为当前工作目录。
cd my_project
首次需要虚拟环境时,系统会自动创建。
在虚拟环境中启动 Python:
pyflow python
实际上,您可以使用 `.` 来执行环境中任何可用的命令pyflowcommand。这是 `.` 的缩写pyflow runcommand。
据我所知,Pyflow 并没有专门的方法来激活虚拟环境。你可以像这样深入查看已安装的虚拟环境:
.\__pypackages__\3.8\.venv\Scripts\Activate.ps1
这是 Windows PowerShell。对于 Mac 或 Linux:
source ./__pypackages__/3.8/.venv/bin/activate
然而,我感觉这并非 Pyflow 的预期用法。相反,应该使用 `pip install` 或 `pip install` 来运行所有pyflowcommand命令pyflow python。
使用 Pyflow 安装软件包
与其他许多工具一样,使用 Pyflow 时,您无需手动pip install安装软件包。相反,pyflow install它会在虚拟环境中安装软件包,并将其添加到pyproject.toml.
pyflow install arrow
这将安装 arrow 软件包。
你可能会看到各种各样的其他 Pyflow 命令pyflow help。
pyenv-virtualenv
如果您想用它virtualenv来管理虚拟环境并处理多个 Python 版本,pyenv-virtualenv那么它可能很适合您。
关于 Python 版本管理工具的建议
pyenv-virtualenv:pyenv除非你确定自己确实需要,否则不要使用Python 版本管理工具(或其他任何 Python 版本管理工具)。Python 版本管理工具并非用于管理虚拟环境,而是管理多个 Python 版本。但是,即使你安装了多个 Python 版本,也pyenv可能不需要Python 版本管理工具。在我的 Fedora 系统上,我只使用Python 版本控制工具,例如 `python` 、`python3` 等,效果就很好。在 Windows 系统上,`python3` 和 `python3`也都运行良好。换句话说,在假设 Python 版本管理工具可以解决你尚未解决的问题之前,请仔细审视你的需求和使用习惯。当然,如果你需要,它就在那里。但如果你暂时不需要,可以先把它添加到书签,以后再用,然后继续愉快地编写代码。pyenvpython3.6python3.9py -3.8py -3.7pyenv
pyenv-virtualenv关于Pyflow的一些建议:pyenv-virtualenv如果你需要 Python 版本和虚拟环境管理的组合, Pyflow比 Conda 更年轻、更时尚,速度也更快。不过,它的实战经验可能不如Conda丰富。Conda是另一个内置 Python 版本管理功能的选项。
pyenv-virtualenv 安装
pyenv-virtualenv是 的插件pyenv,所以这是先决条件。
安装方法:pyenv请按照官方说明操作,或直接使用自动安装程序。自动安装程序仅提供安装步骤。curl https://pyenv.run | bash
pyenv在 Windows 系统上无法运行。虽然有一个 Windows 版本的pyenvpyenv,但它似乎与等插件不兼容pyenv-virtualenv。
如果您没有使用自动安装程序,请按照pyvenv-virtualenvpyenv-virtualenv的官方说明手动安装插件。不过,这里有个小提示:git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
与虚拟环境进行交互pyenv-virtualenv
要创建一个新的虚拟环境pyenv-virtualenv,请尝试以下操作:
pyenv virtualenv 3.8.5 venv38
这将在当前目录下创建一个虚拟环境。该环境中的 Python 版本为 3.8.5,虚拟环境的别名为“venv38”。
如果您不确定可以pyenv使用哪些 Python 版本,请尝试以下方法。
pyenv versions
和/或
pyenv install --list
查看有哪些版本可供选择,以便您可以选择pyenv install其中一个。
成功创建虚拟环境后,它应该会出现在列表中:
pyenv virtualenvs
每个虚拟环境都有两个条目,一个长条目和一个短别名。
要手动激活虚拟环境,可以使用短别名:
pyenv activate venv38
停用方法:
pyenv deactivate
请注意,它提供了一个可选功能,当您进入包含有效虚拟环境名称文件的目录pyenv-virtualenv时,该功能会自动激活虚拟环境。根据您的使用习惯,这可能非常方便,也可能非常烦人。请参阅安装说明,为您的 shell 启用此功能。如果您使用了自动安装程序并按照其说明操作,则此功能可能已启用。cd.python-version
进入已激活的虚拟环境后,您可以按照上述pip说明安装软件包。venv
您可以使用pyenv help和找到一些命令行帮助pyenv help virtualenv。
康达
Conda不仅仅是另一个 Python 包管理器或环境管理器;它是一个独立的 Python 生态系统。Conda的包仓库与大多数包/项目管理器使用的PyPI 仓库不同。Conda 仓库包含约 1500 个软件包,而 PyPI 仓库则包含约 15 万个软件包。也就是说,如果需要,Conda 也可以与 pip 一起使用。
安装 Conda
如果你想要一个功能齐全、包罗万象的 Python 和所有科学工具的安装包,可以看看Anaconda。不过,它和本文中提到的其他工具相比,就显得不太合适了。Miniconda 更适合你。Miniconda 提供命令行工具以及入门所需的全部依赖项。这通常就足够了。如果你不确定 Anaconda 和Minicondaconda哪个更适合你,可以参考一下相关的对比评测。
要安装 Miniconda,请找到适用于您的安装程序,下载并安装。您的软件包管理器(例如 apt apt、dnfapt、brewapt 等)可能也已包含 Conda。
在我的一个 Linux 系统上,我还需要先配置 Conda 以使用我的 shell。由于我使用的是 Bash,所以我这样做了:
conda init bash
conda config --set auto_activate_base false
第一条命令会给你的.bashrc文件添加一些功能,包括自动激活“基础”Conda环境。我并非总是需要Conda,所以这个功能对我来说不太合适。因此我添加了第二条命令,它会~/.condarc在你的用户目录下创建一个包含该设置的文件。
与 Conda 虚拟环境交互
要创建一个新的虚拟环境,请指定要使用的虚拟环境的名称(可以是任何名称),还可以(但建议)指定 Python 版本:
conda create --name env38 python=3.8.5
创建完成后,您可以使用以下命令激活虚拟环境:
conda activate env38
请务必指定您之前选择的虚拟环境名称。
要停用虚拟环境
conda deactivate
无论使用哪个 shell 或平台, ` conda activateand`conda deactivate命令都能正常工作。真棒!
使用 Conda 安装软件包
要使用 Conda 安装软件包,请使用conda install,并确保已使用 激活虚拟环境conda activate。
conda install arrow
上述命令会安装“arrow”软件包。Conda 的一个优点是:它会准确地告诉你它将在哪里执行什么操作。因此,你可以确切地知道它是在虚拟环境(以及是哪个虚拟环境)内安装软件包,还是在系统范围内安装。Conda 非常健谈,我喜欢这一点。
孵化
Hatch有点像Pyflow,它很时髦(pyproject.toml例如,它会使用一些比较冷门的工具),功能也很多。就我所见,它绝对是预填充测试用例最强大的工具。
安装 Hatch
我建议使用pipxpipx 来安装 Hatch。您可以阅读我关于 pipx 的文章“如何安装 Python 命令行工具或脚本? ”,了解相关解释和说明。
pipx install hatch
与Hatch的虚拟环境进行交互
要使用 Hatch 创建新的虚拟环境,首先要创建项目:
hatch new my_project
注意:Hatch 可以使用Conda来管理 Python 版本。实际上,
hatch conda它会将 miniconda 安装到您选择的位置。如果您已通过这种方式安装了 miniconda,则可以使用类似这样的命令hatch new -py 3.8.5 my_project来指定 Python 版本。
hatch new自动创建虚拟环境。您可以将该新目录设置为当前工作目录。
cd my_project
然后使用hatch shell该命令进入虚拟环境。你应该能够从新的 shell 中启动 Python 等程序。
要退出此虚拟环境,请使用 `quit` 命令退出exit,Ctrl-d或者使用您喜欢的任何方式退出 shell。
使用 Hatch 安装软件包
与其他许多工具一样,Hatch 并不直接用于pip install安装软件包。相反,hatch install它会在虚拟环境中安装软件包。
hatch install arrow
这将安装“arrow”软件包。
未经请求的抱怨:我承认,让我感到非常困惑的是,目前 Hatch 似乎没有更新任何可能的源包:
pyproject.toml,setup.py或requirements.txt。我怀疑这是有意为之:用户必须主动手动将这些包添加到正确的位置。至于哪个位置才是正确的,我想,这取决于您自己。
您可能会看到其他各种带有句点的 Hatch 命令hatch -h。
选择哪种工具?
选择工具其实是一个主观问题。你是谁?你用 Python 做什么?你的需求/愿望是什么?
关于工具选择的建议(未经请求):使用诗歌
以下是一些更为细致的观点,其中一些观点颇具见地且公正。
- 您是否正在构建一个软件包/项目,并想要一个功能强大的工具,能够帮您处理很多事情,并且在 Python 社区中越来越受欢迎?Poetry
- 你是极简主义者/传统主义者/老顽固,并且以此为傲吗?
venv(virtualenv如果你不介意多用一个工具的话) - 你是不是在编写一个简单的、可能只存在一段时间的、一次性的脚本?
venv除非你已经virtualenv安装了 - 您是否需要管理多个不同的 Python 版本,并且所需的软件包都在Conda 仓库中?Conda
- 您是否想要管理多个不同的 Python 版本,并且不想(仅仅)使用 Conda?
pyenv-virtualenv - 你想管理多个不同的 Python 版本,并且你是一位勇于尝试、敢于冒险的早期使用者吗?Pyflow或许适合你。
- 你是数据科学家吗?不妨考虑一下Conda。
- 你已经在使用______并且很喜欢它吗?那就用它。
- 你试过______但不喜欢吗?那就试试其他的吧。




