Python 虚拟环境 venv 详解:创建、管理与依赖隔离
本文详解Python 3.3+内置的venv模块,阐述虚拟环境在解决多项目依赖冲突、版本隔离中的核心作用。涵盖从命令行创建激活虚拟环境,到PyCharm图形界面配置Interpreter的完整流程,并解析虚拟环境目录结构及利用pip freeze生成精准requirements.txt的方法,助力开发者实现干净、独立的项目依赖管理。
虚拟环境(Virtual Environment)是Python开发中用于隔离项目依赖的重要机制。
- 该功能作为Python 3.3版本的新特性引入,相关规范可参考PEP 405:https://www.python.org/dev/peps/pep-0405/
- 通常将操作系统中默认安装的Python称为系统环境。在默认配置下,虚拟环境与系统环境完全隔离,互不干扰。
- 在一个系统Python环境下,用户可以创建并维护多个独立的虚拟环境。
- 每个虚拟环境均包含独立的Python解释器二进制文件及独立的包安装目录。这意味着在特定虚拟环境中安装的Python第三方包,仅对该虚拟环境可见,不会影响系统环境或其他虚拟环境。
核心概念总结
Python虚拟环境的主要目的是为不同的Python项目提供隔离的运行空间。每个项目拥有独立的依赖包环境,确保项目间的依赖包互不冲突、互不影响。
引入虚拟环境的必要性
背景分析
- 假设用户的计算机中同时存在多个Python项目。
- 这些项目可能依赖不同版本的Python解释器,例如部分项目需Python 2.X,而另一部分需Python 3.X。
- 各项目的依赖包需求也存在差异,例如项目A仅需Selenium相关依赖,而项目B仅需Appium相关依赖。
- 即使不同项目使用同名依赖包,其所需的版本号也可能不一致。
若不使用虚拟环境,将会面临以下问题:
了解第三方库的默认安装路径
默认情况下,Python第三方库均安装在系统固定的目录中(以Mac电脑为例)。
>>> import site
>>> site.getsitepackages()
['/usr/local/Cellar/python@3.9/3.9.5/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages']
电脑上所有项目均从该统一目录(站点库)中存储和查找第三方库。
由此引发的问题
- 当不同项目使用同一依赖包但版本不同时,开发项目A需安装依赖包A的特定版本;切换至项目B时,必须先卸载A版本,再重新安装B版本,操作繁琐且易出错。
- 若所有项目依赖均安装在同一环境下,生成项目的requirements.txt文件时,将包含大量当前项目不需要的依赖包。此时需手动逐一删除无用依赖,效率低下且易遗漏。
通过venv操作虚拟环境
自Python 3.5版本起,官方推荐使用venv模块来创建和管理虚拟环境。
创建虚拟环境
python3 -m venv fastapi_test
上述命令中的fastapi_test为虚拟环境名称,用户可根据实际需求自定义命名。
激活虚拟环境
source <环境名称>/bin/activate

激活后,可观察到虚拟环境中仅包含最基础的pip和setuptools包,其他系统级包不可见。
关闭虚拟环境
deactivate
在PyCharm中关联新创建的虚拟环境

首先需在项目所在目录下预先创建好虚拟环境。
在PyCharm设置中,将Python Interpreter(Python解释器)指向已创建的虚拟环境。

随后在虚拟环境中安装项目所需的第三方库。

在PyCharm中直接创建虚拟环境

- 进入Python Interpreter设置界面。
- 点击“查看更多 Interpreters”选项。
- 选择“添加新的 Interpreters”。
- 选择“New environment”(新环境),保持默认选项即可,点击确定完成创建。

查看虚拟环境的目录结构

通过对比可知,不同名称的虚拟环境目录结构基本一致。
bin目录
包含与虚拟环境交互的可执行文件,如激活脚本和Python解释器链接。
>> ll
total 72
-rw-r--r-- 1 polo staff 8.6K Sep 14 09:26 Activate.ps1
-rw-r--r-- 1 polo staff 1.9K Sep 14 09:26 activate
-rw-r--r-- 1 polo staff 882B Sep 14 09:26 activate.csh
-rw-r--r-- 1 polo staff 2.0K Sep 14 09:26 activate.fish
-rwxr-xr-x 1 polo staff 269B Sep 14 08:40 pip
-rwxr-xr-x 1 polo staff 269B Sep 14 08:40 pip3
-rwxr-xr-x 1 polo staff 269B Sep 14 08:40 pip3.9
lrwxr-xr-x 1 polo staff 9B Sep 14 08:40 python -> python3.9
lrwxr-xr-x 1 polo staff 9B Sep 14 08:40 python3 -> python3.9
lrwxr-xr-x 1 polo staff 39B Sep 14 08:40 python3.9 -> /usr/local/opt/python@3.9/bin/python3.9
include目录
存放编译Python扩展包所需的C语言头文件。
lib目录
包含当前Python版本的副本(如python3.9)以及安装的所有依赖包的site-packages文件夹。
>> pwd
/Users/polo/Downloads/FastAPI_project/fastapi_test/lib/python3.9/site-packages
>> ll
total 224
drwxr-xr-x 3 polo staff 96B Sep 14 09:27 __pycache__
drwxr-xr-x 5 polo staff 160B Sep 14 08:40 _distutils_hack
-rw-r--r-- 1 polo staff 152B Sep 14 08:40 distutils-precedence.pth
drwxr-xr-x 28 polo staff 896B Sep 14 09:27 fastapi
drwxr-xr-x 8 polo staff 256B Sep 14 09:27 fastapi-0.68.1.dist-info
drwxr-xr-x 8 polo staff 256B Sep 14 08:40 pip
drwxr-xr-x 10 polo staff 320B Sep 14 08:40 pip-21.1.1.dist-info
drwxr-xr-x 7 polo staff 224B Sep 14 08:40 pkg_resources
drwxr-xr-x 53 polo staff 1.7K Sep 14 09:27 pydantic
drwxr-xr-x 9 polo staff 288B Sep 14 09:27 pydantic-1.8.2.dist-info
drwxr-xr-x 41 polo staff 1.3K Sep 14 08:40 setuptools
drwxr-xr-x 11 polo staff 352B Sep 14 08:40 setuptools-56.0.0.dist-info
drwxr-xr-x 27 polo staff 864B Sep 14 09:27 starlette
drwxr-xr-x 8 polo staff 256B Sep 14 09:27 starlette-0.14.2.dist-info
drwxr-xr-x 8 polo staff 256B Sep 14 09:27 typing_extensions-3.10.0.2.dist-info
-rw-r--r-- 1 polo staff 107K Sep 14 09:27 typing_extensions.py
从虚拟环境生成requirements.txt
首先查看当前环境中已安装的包列表。
> pip list
Package Version
----------------- --------
fastapi 0.68.1
pip 21.1.1
pydantic 1.8.2
setuptools 56.0.0
starlette 0.14.2
typing-extensions 3.10.0.2
使用pip freeze命令。
务必在已激活的虚拟环境下执行该命令。
pip freeze > requirement.txt

通过上述操作生成的requirements.txt文件,将仅包含当前虚拟环境中实际安装的依赖包,确保依赖清单的精准性。
其他包管理工具如poetry也可用于依赖管理
待补充
至此,关于Python虚拟环境venv的详解介绍完毕。如需了解更多Python虚拟环境相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









