MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python虚拟环境的创建与管理

2022-05-012.7k 阅读

什么是 Python 虚拟环境

在深入探讨 Python 虚拟环境的创建与管理之前,我们首先需要明确什么是虚拟环境。简单来说,Python 虚拟环境是一种在系统中创建独立 Python 运行环境的机制。它允许我们在同一台机器上为不同的项目设置不同的 Python 包版本,从而避免因包版本冲突而导致的各种问题。

在 Python 开发过程中,不同的项目可能依赖于同一个包的不同版本。例如,项目 A 可能依赖 Django 2.2,而项目 B 依赖 Django 3.0。如果所有项目都使用系统级别的 Python 环境,就会出现版本冲突,导致至少一个项目无法正常运行。Python 虚拟环境为这个问题提供了优雅的解决方案。

从本质上讲,虚拟环境是一个包含了特定 Python 解释器以及一组独立安装的 Python 包的目录树。每个虚拟环境都是相互隔离的,它们之间不会相互干扰。这意味着,在一个虚拟环境中安装、升级或删除包,不会影响其他虚拟环境。

创建 Python 虚拟环境

使用 venv 模块创建虚拟环境

在 Python 3.3 及以上版本中,venv 模块是创建虚拟环境的标准工具。它简单易用,并且不需要额外安装任何第三方库。

要使用 venv 创建虚拟环境,首先打开终端(在 Windows 上是命令提示符或 PowerShell),然后执行以下命令:

python3 -m venv myenv

上述命令会在当前目录下创建一个名为 myenv 的虚拟环境。myenv 这个名称可以根据你的需求任意修改。执行完这个命令后,会在当前目录下生成一个 myenv 目录,该目录结构如下:

myenv/
├── bin/
│   ├── activate
│   ├── python
│   └── pip
├── include/
└── lib/
    └── pythonX.Y/
        └── site-packages/

bin 目录包含了激活虚拟环境的脚本(如 activate)、Python 解释器(python)以及包管理工具 pipinclude 目录用于存放 C 语言扩展模块所需的头文件。lib 目录则包含了安装在虚拟环境中的 Python 包。

激活虚拟环境

虚拟环境创建好之后,需要激活它才能使用。激活虚拟环境的方式因操作系统而异。

在 Linux 和 macOS 上,对于基于 venv 创建的虚拟环境,激活命令如下:

  • bash 或 zsh 环境
    source myenv/bin/activate
    

在 Windows 上,在命令提示符下激活虚拟环境的命令为:

myenv\Scripts\activate.bat

在 PowerShell 中,激活命令为:

myenv\Scripts\Activate.ps1

注意,在 PowerShell 中,如果执行脚本时遇到权限问题,可能需要先执行 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 来允许执行本地脚本。

激活虚拟环境后,终端的提示符会发生变化,通常会在前面加上虚拟环境的名称。例如:

(myenv) user@computer:~$ 

使用 virtualenv 创建虚拟环境

在 Python 3.3 之前,virtualenv 是创建虚拟环境的主要工具。即使在 Python 3.3 之后,virtualenv 仍然是一个非常受欢迎的选择,因为它支持在旧版本的 Python 上创建虚拟环境,并且提供了更多的定制选项。

首先,需要安装 virtualenv。在拥有 pip 的情况下,可以使用以下命令进行安装:

pip install virtualenv

安装完成后,使用以下命令创建虚拟环境:

virtualenv myenv

这会在当前目录下创建一个名为 myenv 的虚拟环境。与 venv 类似,myenv 名称可自定义。virtualenv 创建的虚拟环境目录结构与 venv 大致相同,但在一些细节上可能会有所不同。

激活 virtualenv 创建的虚拟环境的方法与 venv 创建的虚拟环境相同,在 Linux 和 macOS 上使用 source myenv/bin/activate,在 Windows 命令提示符下使用 myenv\Scripts\activate.bat,在 PowerShell 中使用 myenv\Scripts\Activate.ps1

管理 Python 虚拟环境

安装包

一旦虚拟环境被激活,就可以使用 pip 在其中安装包。例如,要安装 numpy 包,可以执行以下命令:

pip install numpy

pip 会从 Python Package Index(PyPI)下载 numpy 及其依赖项,并将它们安装到虚拟环境的 site-packages 目录中。如果需要安装特定版本的包,可以在包名后指定版本号,例如:

pip install numpy==1.19.5

升级包

要升级已安装的包,可以使用以下命令:

pip install --upgrade package_name

例如,要升级 numpy 包,执行:

pip install --upgrade numpy

pip 会检查 numpy 的最新版本,并将其升级到最新版本(前提是新版本与已安装的其他包兼容)。

查看已安装的包

在虚拟环境中,可以使用以下命令查看已安装的所有包及其版本:

pip list

这会列出所有已安装的包及其版本号,例如:

Package         Version
--------------- -------
numpy           1.19.5
pip             21.3.1
setuptools      57.5.0

导出和安装依赖

在开发项目时,通常需要记录项目所依赖的包及其版本,以便在其他环境中进行部署。可以使用以下命令将当前虚拟环境中已安装的包及其版本导出到一个文件中:

pip freeze > requirements.txt

这会在当前目录下生成一个 requirements.txt 文件,内容类似于:

numpy==1.19.5
requests==2.26.0

在其他环境中,可以使用以下命令根据 requirements.txt 文件安装相同版本的包:

pip install -r requirements.txt

删除包

要删除虚拟环境中已安装的包,可以使用以下命令:

pip uninstall package_name

例如,要删除 numpy 包,执行:

pip uninstall numpy

pip 会提示确认是否删除,输入 y 并回车即可完成删除操作。

虚拟环境的克隆

有时候,可能需要创建一个与现有虚拟环境完全相同的虚拟环境,包括已安装的包及其版本。虽然没有直接克隆虚拟环境的标准命令,但可以通过导出依赖并在新的虚拟环境中安装来实现类似的效果。

假设已经有一个名为 source_env 的虚拟环境,要创建一个克隆 target_env,可以按以下步骤操作:

  1. 激活 source_env 虚拟环境,并导出依赖:

    source source_env/bin/activate
    pip freeze > requirements.txt
    deactivate
    
  2. 创建 target_env 虚拟环境并激活:

    python3 -m venv target_env
    source target_env/bin/activate
    
  3. target_env 中安装导出的依赖:

    pip install -r requirements.txt
    

这样就创建了一个与 source_env 基本相同的 target_env 虚拟环境。

虚拟环境的删除

当不再需要某个虚拟环境时,可以直接删除其对应的目录来删除虚拟环境。在 Linux 和 macOS 上,可以使用以下命令删除名为 myenv 的虚拟环境:

rm -rf myenv

在 Windows 上,可以在文件资源管理器中找到 myenv 目录并删除它,或者在命令提示符下使用 rd /s /q myenv 命令(注意 rd 命令的危险性,确保要删除的目录是正确的虚拟环境目录)。

虚拟环境与项目结构

推荐的项目结构

在使用虚拟环境进行项目开发时,遵循一定的项目结构可以提高代码的可维护性和可读性。一个常见的项目结构如下:

project/
├── my_project/
│   ├── __init__.py
│   ├── module1.py
│   └── module2.py
├── tests/
│   ├── __init__.py
│   ├── test_module1.py
│   └── test_module2.py
├── venv/
├── requirements.txt
├── README.md
└── setup.py

在这个结构中,my_project 目录包含项目的源代码,tests 目录用于存放测试代码,venv 目录是项目的虚拟环境(也可以使用其他名称),requirements.txt 文件记录项目的依赖,README.md 用于项目说明,setup.py 用于项目的打包和分发。

将虚拟环境与项目关联

为了方便管理,可以将虚拟环境与特定项目关联起来。一种常见的做法是在项目根目录下创建虚拟环境。例如,在上述项目结构中,在 project 目录下创建虚拟环境:

cd project
python3 -m venv venv
source venv/bin/activate

这样,每次进入项目目录时,只需要激活虚拟环境就可以确保使用正确的 Python 环境和依赖。

高级虚拟环境管理

使用 virtualenvwrapper

virtualenvwrapper 是一个增强 virtualenv 功能的工具集,它提供了更方便的虚拟环境管理命令。

首先,需要安装 virtualenvwrapper。在拥有 pip 的情况下,可以使用以下命令进行安装:

pip install virtualenvwrapper

在 Linux 和 macOS 上,安装完成后,需要在 ~/.bashrc~/.zshrc 文件中添加以下配置:

export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

在 Windows 上,需要在环境变量中设置 WORKON_HOME 为虚拟环境的存放目录,并且在启动脚本(如 autoexec.bat 或 PowerShell 配置文件)中添加 virtualenvwrapper.bat 的路径。

安装并配置好 virtualenvwrapper 后,可以使用以下常用命令:

  • 创建虚拟环境

    mkvirtualenv myenv
    
  • 列出所有虚拟环境

    lsvirtualenv
    
  • 激活虚拟环境

    workon myenv
    
  • 删除虚拟环境

    rmvirtualenv myenv
    

virtualenvwrapper 还提供了许多其他有用的命令,例如 cdvirtualenv 用于快速进入虚拟环境的目录,cpvirtualenv 用于复制虚拟环境等。

使用 conda 管理虚拟环境

conda 是一个跨平台的包管理系统和环境管理系统,最初是为 Python 开发的,但现在也支持其他语言。conda 可以创建和管理虚拟环境,并且在处理复杂的依赖关系时表现出色,特别是在科学计算和数据科学领域。

要安装 conda,可以从 Anaconda 或 Miniconda 的官方网站下载安装包并进行安装。安装完成后,可以使用以下命令创建虚拟环境:

conda create --name myenv python=3.8

上述命令会创建一个名为 myenv 的虚拟环境,并安装 Python 3.8。要激活 conda 虚拟环境,在 Linux 和 macOS 上使用:

conda activate myenv

在 Windows 上使用:

conda activate myenv

conda 虚拟环境中安装包使用 conda install 命令,例如:

conda install numpy

conda 还支持从 requirements.txt 文件安装依赖,但需要使用 conda install --file requirements.txt 命令,并且 requirements.txt 文件格式需要符合 conda 的要求。

pipvirtualenv 相比,conda 的优势在于它可以处理非 Python 依赖,并且在安装包时能够更好地解决依赖冲突。但在纯 Python 项目中,venvvirtualenv 通常是更轻量级的选择。

虚拟环境与 IDE 的集成

大多数现代的 Python IDE,如 PyCharm、VS Code 等,都支持与虚拟环境的集成。

在 PyCharm 中,可以在项目设置中指定使用的 Python 解释器。如果项目已经有一个虚拟环境,可以选择虚拟环境中的 Python 解释器(通常位于 venv/bin/pythonmyenv\Scripts\python.exe)。这样,PyCharm 就会在该虚拟环境中运行项目,并且可以直接在 IDE 中管理包的安装、升级和删除。

在 VS Code 中,可以通过在项目根目录下创建 .vscode 目录,并在其中创建 settings.json 文件来指定使用的 Python 解释器。例如:

{
    "python.pythonPath": "path/to/venv/bin/python"
}

或者,可以在 VS Code 的命令面板中选择 “Python: Select Interpreter” 来选择虚拟环境中的 Python 解释器。集成虚拟环境到 IDE 可以提高开发效率,因为不需要在终端和 IDE 之间频繁切换来管理环境和运行项目。

常见问题及解决方法

虚拟环境激活失败

  1. 权限问题:在 Windows 的 PowerShell 中,如果无法执行激活脚本,可能是因为执行策略限制。可以通过 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 命令来允许执行本地脚本。在 Linux 和 macOS 上,如果 activate 脚本没有执行权限,可以使用 chmod +x myenv/bin/activate 命令添加执行权限。
  2. 路径问题:确保激活命令中的路径是正确的。如果虚拟环境不在当前目录,需要提供完整路径。例如,如果虚拟环境在 /home/user/envs/myenv,则激活命令为 source /home/user/envs/myenv/bin/activate

包安装失败

  1. 网络问题:包安装失败可能是由于网络连接问题。可以尝试使用 pip --default-timeout=100 install package_name 来设置较长的超时时间,或者检查网络连接是否正常。另外,可以更换 PyPI 源,例如使用清华大学的镜像源:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name
  2. 依赖冲突:有时候,包安装失败是因为依赖冲突。可以查看 pip 的错误信息,尝试手动安装依赖包的合适版本,或者使用 conda 等工具来解决依赖问题。conda 在处理复杂依赖关系方面通常更有效。

虚拟环境与系统环境混淆

如果在虚拟环境中安装的包似乎影响了系统环境,或者在虚拟环境中无法找到已安装的包,可能是虚拟环境没有正确激活。确保在操作之前激活了正确的虚拟环境,并且在虚拟环境激活后再进行包的安装、升级等操作。另外,检查 PYTHONPATH 环境变量是否设置正确,避免其干扰虚拟环境的正常工作。

通过以上详细的介绍,你应该对 Python 虚拟环境的创建与管理有了全面的了解。无论是简单的项目还是复杂的大型项目,合理使用虚拟环境都能有效提高开发效率,避免版本冲突等问题。希望这些知识能对你的 Python 开发工作有所帮助。