Python 虚拟环境管理

PythonBeginner
立即练习

简介

Python 项目通常需要不同版本的软件包。虚拟环境可以为每个项目提供独立的 Python 解释器和软件包目录,这样在一个项目中安装软件包就不会影响全局 Python 环境或其他项目。

在本实验中,你将使用内置的 venv 模块创建一个虚拟环境,激活它,在其中安装一个软件包,并创建第二个环境以确认各环境之间是相互隔离的。所有操作均在 /home/labex/project 目录下进行。

创建项目虚拟环境

在此步骤中,你将为 Python 项目创建一个虚拟环境。虚拟环境本质上就是一个包含 Python 可执行文件、激活脚本及其专属软件包安装区域的目录。

首先进入项目工作区。将实验文件保存在 /home/labex/project 下,可以方便查找并使你的工作与系统文件保持分离。

cd /home/labex/project

在创建环境之前,请检查系统中可用的 Python 版本。python3 --version 命令会打印出 venv 将要使用的解释器版本。

python3 --version

你应该会看到类似以下的 Python 3 输出:

Python 3...

现在创建一个名为 project-env 的虚拟环境。-m venv 选项告诉 Python 将其内置的 venv 模块作为命令行工具运行,而 project-env 则是存放该环境的目录。

python3 -m venv project-env

列出新目录的内容,查看 venv 创建的结构。

ls project-env

具体条目可能会略有不同,但你应该能看到类似以下的文件和文件夹:

bin
include
lib
pyvenv.cfg

pyvenv.cfg 文件记录了该环境的创建方式。现在检查一下它。

cat project-env/pyvenv.cfg

查找 include-system-site-packages = false。该设置意味着此环境不会自动共享全局安装的 Python 软件包。

激活环境并安装软件包

在此步骤中,你将激活 project-env 并在其中安装一个软件包。激活操作会更改 Shell 环境变量,从而使 pythonpip 等命令优先指向虚拟环境。

确保你仍处于项目工作区中。

cd /home/labex/project

使用 source 在当前 Shell 中运行激活脚本。这一点很重要,因为子脚本无法更改父 Shell,而 source 可以更新你当前正在使用的 Shell。

source project-env/bin/activate

激活后,Shell 提示符通常会以 (project-env) 开头。通过打印 Python 的两个路径来确认 python 现在是否指向虚拟环境内部。sys.prefix 是当前激活的环境,而 sys.base_prefix 是基础 Python 安装路径。

python -c "import sys; print(sys.prefix); print(sys.base_prefix)"

第一行应该是你的虚拟环境路径,第二行应该是系统 Python 的位置:

/home/labex/project/project-env
/usr...

在激活的环境中安装一个名为 colorama 的小型软件包。运行 python -m pip 会使用属于当前激活的 Python 解释器的 pip

python -m pip install colorama==0.4.6

安装完成后,pip 应该会报告 colorama 已成功安装。

通过导入该包并打印其版本来验证安装情况。

python -c "import colorama; print(colorama.__version__)"

输出应该是:

0.4.6

你可以使用 deactivate 退出虚拟环境。这会将 pythonpip 的查找行为恢复到正常的 Shell 环境。

deactivate

创建第二个隔离环境

在此步骤中,你将创建另一个虚拟环境并将其与 project-env 进行比较。不同的环境可以使用相同的基础 Python 解释器,同时保持各自安装的软件包相互独立。

返回项目工作区。

cd /home/labex/project

查找系统 python3 可执行文件。command -v 命令会打印 Shell 执行某个命令时所使用的路径。

command -v python3

该路径通常为:

/usr/bin/python3

创建一个名为 tools-env 的第二个环境。--prompt tools-env 选项设置了激活提示符文本,这在你同时处理多个环境时非常有用。

python3 -m venv --prompt tools-env tools-env

现在比较两个环境的前缀。每个命令都会运行不同虚拟环境内的 Python 可执行文件,并打印其激活的前缀。

project-env/bin/python -c "import sys; print(sys.prefix)"
tools-env/bin/python -c "import sys; print(sys.prefix)"

你应该会看到两个不同的目录:

/home/labex/project/project-env
/home/labex/project/tools-env

最后,检查 colorama 是否在 tools-env 中可用。由于你只在 project-env 中安装了 colorama,因此第二个环境应该找不到它。

tools-env/bin/python -c "import importlib.util; print(importlib.util.find_spec('colorama'))"

预期的输出是:

None

这证实了在一个虚拟环境中安装的软件包不会自动出现在另一个虚拟环境中。

总结

你创建了一个 Python 虚拟环境,检查了其配置,激活了它,在其中安装了软件包,并创建了第二个环境以确认软件包的隔离性。你还练习了使用 python3 -m venvsourcepython -m pip 以及直接调用环境内的 Python 路径,从而理解了当前运行的是哪个解释器。