在软件开发,特别是使用 Python 进行开发时,我们经常会遇到一个常见的问题:不同的项目可能依赖于不同版本甚至不同库的组合。直接在系统全局环境中安装所有这些依赖,很容易导致版本冲突,造成“依赖地狱”。为了解决这个问题,虚拟环境应运而生。
什么是虚拟环境?
从最实际的角度来看,一个虚拟环境就是一个独立于系统全局 Python 环境的、包含了 Python 解释器、库和脚本的目录。它就像一个“沙盒”,你在其中安装的任何包都只存在于这个沙盒里,不会影响到系统全局环境或其他虚拟环境。
为什么需要虚拟环境?
使用虚拟环境的主要原因和好处包括:
- 避免冲突: 你的项目 A 需要库 X 的版本 1.0,而你的项目 B 需要库 X 的版本 2.0。如果没有虚拟环境,这会是一个巨大的麻烦。虚拟环境允许你在项目 A 的环境中安装 X 1.0,在项目 B 的环境中安装 X 2.0,它们互不干扰。
- 环境隔离: 每个项目都可以拥有自己独立、干净的环境。这样更容易管理项目依赖,也避免了因为某个项目的库安装或升级而影响到其他项目或系统本身的 Python 环境。
-
可复现性: 通过记录虚拟环境中安装的库和版本(通常通过一个依赖文件,如
requirements.txt
),你可以轻松地在任何其他机器上或未来的时间点重建完全相同的开发环境,这对于团队协作和部署非常重要。 - 保持系统整洁: 避免在系统全局环境中安装大量不相关的库,保持系统环境的干净。
【怎么创建虚拟环境】 – 使用 Python 内置的 venv 模块
从 Python 3.3 版本开始,Python 标准库就包含了 venv
模块,这是创建轻量级虚拟环境的首选工具,因为它无需额外安装。
创建虚拟环境的步骤
第一步:打开终端或命令提示符
你需要使用命令行来执行创建虚拟环境的命令。
第二步:导航到你的项目目录(可选但推荐)
虽然你可以在任何地方创建虚拟环境,但通常推荐在你的项目根目录中或其内部创建一个子目录来存放虚拟环境。这样做有助于将环境与项目关联起来。
cd /path/to/your/project
如果你只是想创建一个独立的虚拟环境用于测试或其他目的,可以跳过这一步,直接在任意位置创建。
第三步:执行创建命令
使用 python -m venv
命令来创建虚拟环境。你需要指定一个目录名称来存放这个环境。常用的名称是 .venv
、venv
或 env
。这里的点号 .
在某些系统下会隐藏该目录。
例如,在当前目录下创建一个名为 .venv
的虚拟环境:
python -m venv .venv
或者创建一个名为 venv
的虚拟环境:
python -m venv venv
执行此命令后,venv
模块会在你指定的目录下创建一个新的目录(比如 .venv
)。这个目录结构通常包括:
bin/
或Scripts/
:包含 Python 解释器、pip
等可执行文件,以及激活脚本。lib/
或Lib/
:存放该虚拟环境安装的 Python 库。pyvenv.cfg
:一个配置文件,包含环境的相关信息。
创建过程通常很快。
激活虚拟环境
创建完成后,虚拟环境并不会自动启用。你需要“激活”它。激活虚拟环境会修改你当前终端会话的 PATH
环境变量,使其优先使用虚拟环境中的 Python 解释器和脚本(如 pip
)。
Windows 系统 (命令提示符或 PowerShell)
如果在项目目录下创建了名为 .venv
的环境:
.venv\Scripts\activate
如果在项目目录下创建了名为 venv
的环境:
venv\Scripts\activate
请注意,在 PowerShell 中执行此命令前,可能需要允许执行本地脚本。如果遇到权限问题,可以尝试以管理员身份运行 PowerShell 并执行 Set-ExecutionPolicy RemoteSigned
命令。
macOS 或 Linux 系统 (Bash 或 Zsh)
如果在项目目录下创建了名为 .venv
的环境:
source .venv/bin/activate
如果在项目目录下创建了名为 venv
的环境:
source venv/bin/activate
激活成功后,你的终端提示符前会显示虚拟环境的名称(通常是你在创建时指定的目录名),例如 (.venv)
或 (venv)
。
(.venv) your_username@your_computer:~/path/to/your/project$
现在,你在该终端会话中运行的 python
或 pip
命令都将指向虚拟环境内的解释器和包管理器。
在虚拟环境中安装包
虚拟环境激活后,你可以使用标准的 pip
命令来安装项目所需的任何包。这些包只会被安装到当前激活的虚拟环境中。
pip install package_name
pip install package_name==1.2.3
pip install -r requirements.txt
(从依赖文件中安装)
退出(停用)虚拟环境
当你完成在虚拟环境中的工作,或者需要切换到另一个环境时,可以停用当前环境。
只需在激活的虚拟环境中运行以下命令:
deactivate
这个命令适用于所有系统(Windows, macOS, Linux)。执行后,终端提示符前的环境名称会消失,你的 PATH
环境变量会恢复到激活前的状态,python
和 pip
命令将再次指向系统全局环境或激活前指向的环境。
删除虚拟环境
如果你不再需要某个虚拟环境,可以直接删除存放虚拟环境的整个目录。
首先,确保你已经停用了该虚拟环境(如果它当前是激活状态)。
然后,使用文件管理器或者命令行删除对应的目录。
Windows 系统
rmdir /s /q .venv
macOS 或 Linux 系统
rm -rf .venv
请将 .venv
替换为你创建虚拟环境时指定的目录名。
【怎么创建虚拟环境】 – 使用其他常用工具(如 virtualenv, conda)
除了内置的 venv
模块,还有其他一些流行的工具可以创建虚拟环境,它们可能提供一些额外的功能或适用于特定的场景。
使用 virtualenv
virtualenv
是一个比 venv
更早出现的虚拟环境创建工具,功能强大且支持旧版本的 Python (Python 2.7+)。如果你需要支持 Python 3.3 之前的版本,或者需要 virtualenv
提供的一些高级功能,可以使用它。
安装 virtualenv
由于 virtualenv
不是 Python 标准库的一部分,你需要先全局安装它:
pip install virtualenv
创建虚拟环境
在项目目录下创建虚拟环境(例如命名为 venv
):
virtualenv venv
如果你的系统安装了多个 Python 版本,并且你想用特定版本创建环境,可以指定解释器路径:
virtualenv -p /usr/bin/python3.8 venv
激活/停用 virtualenv 环境
激活和停用 virtualenv
环境的命令与使用 venv
基本相同:
- Windows:
venv\Scripts\activate
- macOS/Linux:
source venv/bin/activate
- 停用:
deactivate
(在激活的环境中运行)
使用 conda
conda
是一个开源的环境管理和包管理系统,特别流行于数据科学领域,因为它能很好地管理 Python 和非 Python 的软件包及其依赖。如果你使用 Anaconda 或 Miniconda,你就可以使用 conda
来创建和管理环境。conda
的环境通常包含 Python 解释器以及通过 conda install
安装的包。
创建环境
创建一个名为 myenv
的新环境,并指定 Python 版本(例如 3.9):
conda create --name myenv python=3.9
你也可以在创建时一并安装一些常用的包:
conda create --name myenv python=3.9 numpy pandas matplotlib
激活环境
conda activate myenv
激活后,终端提示符会显示环境名称,例如 (myenv)
。
在 conda 环境中安装包
在 conda 环境中主要使用 conda install
来安装包:
conda install package_name
当然,你也可以使用 pip install package_name
在 conda 环境中安装那些只存在于 PyPI 但不在 conda 仓库中的包。
停用 conda 环境
conda deactivate
删除 conda 环境
conda remove --name myenv --all
这里的 myenv
是你想删除的环境名称。
虚拟环境的存放位置和大小问题
存放位置
如前所述,最常见的做法是将虚拟环境创建在项目根目录下的一个子目录里(如 .venv
)。这样可以保持项目文件的集中性,也方便版本控制工具(如 Git)忽略这个目录(通常在 .gitignore
文件中添加该目录名)。你也可以选择将所有虚拟环境集中存放在一个固定的位置,但这需要你在激活时记住其完整路径。
占用空间
一个新创建的、不包含任何额外库的虚拟环境通常会占用几十 MB 到几百 MB 的空间,因为它包含了 Python 解释器的一个副本以及基本的工具(如 pip, setuptools, wheel)。随着你在其中安装越来越多的库,其占用的空间会相应增加。对于大型项目,一个包含了众多科学计算库或 Web 框架的虚拟环境可能会占用数百 MB 甚至几个 GB 的空间。尽管如此,相比于在全局环境中安装所有库可能引起的混乱,额外的磁盘空间占用是完全值得的。而且,如果不再需要某个虚拟环境,删除它非常简单。
如何管理项目依赖 (requirements.txt)
创建和使用虚拟环境的一个重要配套实践是管理项目的依赖列表。通常使用一个名为 requirements.txt
的文件来记录当前环境中安装的所有库及其精确版本。
导出当前环境的依赖
在虚拟环境激活状态下,运行以下命令可以将当前环境中所有通过 pip 安装的包及其版本输出到 requirements.txt
文件:
pip freeze > requirements.txt
这个文件应该被添加到你的项目代码库中,以便其他人或你在其他机器上可以轻松重建相同的环境。
从文件安装依赖
当你获取到一个包含 requirements.txt
文件的项目时,首先应该为其创建一个新的虚拟环境并激活它,然后使用以下命令安装所有列出的依赖:
pip install -r requirements.txt
这将确保你在一个干净的环境中拥有项目所需的所有精确版本的库。
如何使用不同 Python 版本创建虚拟环境
如果你的系统安装了多个 Python 版本(例如 Python 3.8 和 Python 3.9),并且你想使用特定版本创建虚拟环境,可以在创建命令中明确指定要使用的 Python 解释器。
使用 venv
时,你可以通过运行特定版本的 Python 解释器来调用 venv
模块:
/path/to/python3.8 -m venv my_project_env_py38
或者,如果你的不同版本 Python 已经添加到系统的 PATH 中并有不同的名称(如 python3.8
):
python3.8 -m venv my_project_env_py38
使用 virtualenv
时,可以使用 -p
参数指定解释器路径:
virtualenv -p /path/to/python3.8 my_project_env_py38
使用 conda
时,创建环境时直接指定版本即可:
conda create --name my_project_env_py38 python=3.8
确保你在创建时使用的是目标 Python 版本的解释器或相应的命令。
总结
创建和使用虚拟环境是现代 Python 开发中一个不可或缺的实践。它提供了一种简单而有效的方式来隔离项目依赖,避免版本冲突,确保开发环境的可重复性。无论是使用 Python 内置的 venv
、功能更丰富的 virtualenv
,还是适合数据科学的 conda
,其核心思想都是一致的:为每个项目提供一个独立、干净的工作空间。掌握如何创建、激活、使用和管理虚拟环境,将极大地提升你的开发效率和项目管理能力。