目录
- 一、什么是python环境
- 1.1 什么是python环境
- 1.2 什么是python虚拟环境
- 二、sys.path 生成和使用(包查找顺序)
- 2.1 是什么
- 2.2 用来干什么
- 2.3 包含什么
- 2.4 生成方式和存储
- 三、pip 包管理
- 四,虚拟环境的使用和管理
- 4.1 Anaconda
- 4.1.1 Anaconda
- 4.1.2 conda
- 4.1.3 conda环境管理
- 4.2 uv
- 是什么
- 用来干什么
- 优势
- 如何用
- 环境创建
- 切换、查看、退出环境
- 环境内使用、安装包
- 环境迁移、备份、删除环境
- 五,python cli
- 是什么
- 用来干什么
- 原理
- pip和setuptools
- 核心流程
一、什么是python环境
1.1 什么是python环境
是什么?
运行、开发 Python 代码的整套配套环境,让系统能识别并执行.py 程序。
包含内容?
- Python 解释器:核心,翻译执行代码
- 标准库:自带内置工具包(文件、网络、数学等)
- 第三方包:pip 安装的拓展库(numpy、requests 等)
- 包管理工具:pip,安装 / 卸载第三方库
目录层次结构
windows:
C:\Python310\├── Lib/ │ ├── site-packages/# 第三方包│ ├── json/ │ ├── os.py │ └──... ├── Scripts/# 可执行脚本│ ├── pip.exe │ ├── python.exe │ └──... ├── Include/# 头文件└── DLLs/# 动态链接库linux:
/usr/local/python3.10/ ├── bin/ │ ├── python3、pip3# 解释器、pip├── lib/python3.10/ │ ├── 标准库源码 │ └── site-packages/# 全局第三方包└── include/、share/1.2 什么是python虚拟环境
是什么?
系统环境(全局环境)的轻量复制,是一个轻量级的隔离环境。
包含什么?
- Python 解释器:Windows 复制本体文件,Linux/Mac 以软链接复用全局解释器;
- 标准库:不单独复制,通过链接共用全局 Python 自带标准库,可直接调用;
- 独立 pip 工具:专属包管理;
- 完全隔离的 site-packages 文件夹:存放当前项目专属第三方库,不和其他环境共享。
目录结构:
Windows:
venv/ ├── Scripts/ │ ├── python.exe# 复制的解释器程序│ └── pip.exe# 独立pip├── Lib/ │ └── site-packages/# 【完全独立】本项目第三方包└── pyvenv.cfg# 记录依赖的全局Python路径Linux:
venv/ ├── bin/ │ ├── python3# 软链接指向全局解释器│ └── pip3 ├── lib/python3.10/ │ ├── 软链接 → 全局标准库(无本地标准库文件) │ └── site-packages/# 【完全独立】项目第三方包└── pyvenv.cfg我们在pycharm等IDE创建一个python工程时,一般情况下会创建一个当前项目的虚拟环境,以pycharm为例,pycharm会在项目目录中创建一个.venv目录,这个目录就是pycharm创建的虚拟环境,里面包含一个空的存放第三方库的site-packages目录、Scripts目录中包含该虚拟环境的解释器(python.exe)、以及pip等脚本工具。
虽然pycharm创建了这个虚拟环境,但是并不代表我们一定就要用这个虚拟环境,我们可以在设置中选择使用这个虚拟环境或者使用系统环境,直接在设置中的解释器选项中选择使用哪个环境。
二、sys.path 生成和使用(包查找顺序)
2.1 是什么
Python 内置模块sys下的字符串列表,存储模块搜索路径。
2.2 用来干什么
import导入模块时,Python 按列表顺序挨个目录查找.py文件。
2.3 包含什么
- 脚本所在目录或者当前工作目录(项目根目录)
- 直接运行 .py 文件 → 首路径 = 脚本所在目录
- 交互 shell /-m 模块运行 → 首路径 = 当前工作目录(用’'表示)
- 环境变量 PYTHONPATH 配置的自定义目录
- Python 标准库安装目录(内置模块、自带标准库)
- site-packages 第三方包目录 + .pth 文件追加的自定义路径(第三方库存放处)
2.4 生成方式和存储
- 解释器启动,首先将脚本目录或者工作目录加入
sys.path - 再读取
PYTHONPATH环境变量目录加入sys.path。 - 读取编译时固化在解释器二进制里的原始安装路径(全局路径),存入内存
sys.base_prefix,并将sys.prefix初始赋值为该值; - 从解释器所在目录(入口调用路径,就是环境变量里的路径,不会再解析软/硬连接)向上逐层检索,判断是否存在
pyvenv.cfg:- 未找到:全局环境,保留
sys.prefix不变; - 找到虚拟环境标记文件:覆盖
sys.prefix为虚拟环境根目录。
- 未找到:全局环境,保留
- 基于
sys.base_prefix拼接平台配套标准库系列目录(lib/pythonX.Y、动态扩展目录、zip 归档等),统一追加至sys.path; - 解释器自动隐式导入并执行标准库
site模块:site先读取当前sys.prefix加载环境内site-packages,非虚拟环境时额外加载用户独立site-packages,全部追加进sys.path; site扫描site-packages下所有.pth文件,解析其中目录补充至sys.path
整个流程在程序代码运行前一次性完成,运行中可手动修改 sys.path 临时新增搜索路径。
三、pip 包管理
pip是什么
Python 官方包管理工具,用于安装、卸载第三方库。
是否在环境变量?
- 全局 Python:Scripts目录加入系统 PATH,可直接调用 pip;
- 虚拟环境:激活后仅当前终端临时追加 venv 的 Scripts 到 PATH,关闭失效。
pip 如何确定包安装位置
pip工具脚本指向python解释器,操作系统从path中找python解释器执行pip脚本
执行
pip install等价于python -m pip,始终由对应环境的 Python 解释器运行 pip 内部代码。解释器初始化完成后,
sys.prefix代表当前生效环境根目录(全局 Python 或虚拟环境)。无
--user参数时:pip 拼接sys.prefix/lib/pythonX.Y/site-packages作为包安装目录;全局 Python 带
--user时:忽略sys.prefix,安装到用户专属site-packages;虚拟环境中禁止使用
--user,pip 直接报错,只能安装至环境内部site-packages。
补充:--user装用户目录,--target手动指定路径。四,虚拟环境的使用和管理
默认情况下,虚拟环境的管理是Python自带的venv模块在创建和管理虚拟环境,但是venv模块管理虚拟环境有明显的缺陷:
- 环境发现困难,比如说我们想知道本地当前有哪些虚拟环境,venv模块无法做到,我们需要磁盘扫描venv目录才能知道有哪些环境
- 环境复制麻烦
所以,建议使用conda和uv。
4.1 Anaconda
4.1.1 Anaconda
Anaconda 是一个完整的 Python 数据科学平台,包含
- 整套Python全局环境,包含 1500+ 预装数据科学包
- Conda - 强大的包管理和环境管理工具
4.1.2 conda
是什么?
包管理和环境管理工具
用来干什么?
- 安装管理 Python、C/C++、CUDA 等各类底层依赖包,弥补pip无法处理二进制依赖的短板;
- 创建和管理Python环境
优势?
- 管理、查看、切换环境更方便
- 环境隔离更彻底,完全独立的Python解释器、标准库,而不是软链接的方式。
- 环境迁移方便:支持导出 yml 配置,一键复现整套环境。
4.1.3 conda环境管理
创建环境:
每个环境拥有完整独立 Python 解释器,可自由指定任意 Python 版本;
# 指定Python版本创建环境conda create-nenv_namepython=3.10# 从yml配置文件新建环境(迁移复现使用)condaenvcreate-fenvironment.yml# 克隆已有完整环境conda create-nnew_env--cloneold_env切换、查看、退出环境
激活环境后系统 PATH 优先当前环境程序,所有 python/pip 操作作用于该环境;执行 deactivate 退出回到 base。
# 查看所有已创建环境condaenvlist# 激活指定环境(全平台通用)conda activate env_name# 退出当前环境conda deactivate环境内使用、安装包(conda + pip)
优先用 conda install 处理 CUDA、C/C++ 当前环境底层依赖;内置独立 pip,包仅安装到当前环境;
# conda安装依赖(推荐科学计算、底层库)condainstallnumpy pandas# pip安装纯Python包pipinstallrequests# 查看当前环境已装conda包conda list# 查看当前环境pip安装的包pip list环境迁移、备份、删除环境
导出 yml 保存全套依赖,跨设备一键重建;可直接删除无用环境释放磁盘。
# 导出当前环境全部依赖到yml文件condaenvexport>environment.yml# 根据yml文件复现整套环境condaenvcreate-fenvironment.yml# 删除无用环境(-y 跳过确认)conda remove-nenv_name--all-y4.2 uv
是什么
也是一个高性能 Python 包管理器 + 虚拟环境管理工具
用来干什么
- 极速安装、解析 Python 包,解决原生 pip 慢、依赖解析卡顿问题;
- 仅管理 Python 类包,不处理 CUDA、C 编译器等系统二进制依赖;
- 创建、管理标准规范的 Python 虚拟环境。
优势
- 安装、依赖解析速度远超 pip、conda;
- 遵循官方标准虚拟环境规范,生成
pyvenv.cfg,兼容性强; - 体积轻量、占用磁盘小,启动快;
- 完整锁定依赖版本,支持 requirements.txt、pyproject.toml,迁移简单;
- 单二进制文件,无需预装 Python 即可使用。
如何用
环境创建
任意位置创建,不集中管理
两种构建模式:
- 本机已有对应 Python:软链接复用本体解释器 + 标准库,仅隔离site-packages,目录生成
pyvenv.cfg; - 本机无对应版本:自动下载完整独立 Python 至 uv 缓存目录,基于该解释器构建环境;后续环境构建也会复用缓存目录中全局环境。
uv python list 可查看本机所有可用Python全局环境# 指定Python版本(有则复用,无则自动下载到缓存目录再复用)uv venv--python3.10# 指定本机已存在解释器绝对路径创建uv venv--python/usr/bin/python3.10如果创建环境不指定Python版本,uv 选 Python 的优先级逻辑
- 当前目录存在
.python-version文件 → 用文件里写的版本 pyproject.toml有requires-python限制 → 自动匹配兼容版本- 上面都没有:读取当前终端 PATH 里默认
python/python3(which python 对应的解释器) - 若匹配版本本机不存在,uv 会自动下载对应独立 Python 再创建环境
# 当前目录生成 .venv,自动选解释器uv venv# 自定义环境目录,仍自动匹配Pythonuv venv ./env切换、查看、退出环境
uv 环境分散在各个项目目录,无统一命令查看全部环境;依靠修改 PATH 激活,语法同原生 venv。
# 查看本机所有可用Python解释器(系统/conda/uv自带)uv python list# Linux/Mac 激活当前目录 .venvsource.venv/bin/activate# Windows cmd 激活.venv\Scripts\activate# Windows PowerShell 激活.venv\Scripts\Activate.ps1# 退出当前虚拟环境deactivate环境内使用、安装包
uv 仅管理 Python 包,不处理 CUDA 等底层依赖。
uv add xxx:标准项目用法,自动写入pyproject.toml并更新uv.lock,执行uv sync可批量复现全套依赖,区分运行 / 开发依赖,适合团队长期项目。执行 uv add 时它会自动识别当前目录下的.venv,不需要激活环境uv pip install:兼容 pip 语法,速度远超原生 pip,仅安装到环境,不修改配置文件,适配requirements.txt老项目迁移。- 激活环境后直接用原生 pip 也可行,但无法复用 uv 全局缓存,下载解析速度慢。
注意混用弊端:pip/uv pip安装的包不会记录到 lock 文件,环境迁移同步时会缺失,优先统一使用uv add管理依赖。
# 安装运行依赖(替代pip install)uvaddnumpy requests# 仅开发环境依赖uvadd--devpytest black# 卸载包uv remove requests# 列出当前环境所有安装包uv list# 兼容原生pip语法uv pipinstallxxx环境迁移、备份、删除环境
老项目备份、迁移
# 导出标准 requirements.txt 兼容旧工具uv pip freeze>requirements.txt# 根据txt批量安装依赖uv pipinstall-rrequirements.txt# 根据lock文件精确复现完全一致环境(推荐)pyproject.toml和lock文件
pyproject.toml:项目核心配置,声明名称、版本、作者等元数据,以及依赖包的宽松版本范围(如 requests>=2.28),是项目的“需求蓝图”,开发者在此增删依赖。uv sync 第一步读取,确定需要安装哪些包。uv.lock:由 uv 工具根据pyproject.toml解析生成的精确锁定文件,记录每个依赖的精确版本号、哈希校验值及完整依赖树,确保所有环境安装结果绝对一致。禁止手动修改,运行 uv sync 或 uv add 时自动更新。uv sync 第二步强制按 lock 版本安装,忽略 toml 宽松范围。
环境备份流程
- 项目环境创建后,先执行
uv init,用于创建pyproject.toml文件 - 添加依赖:
uv add xxx- 自动更新 pyproject.toml,写入依赖版本下限;
- 重新解析依赖树,更新 uv.lock;
- 基于 uv.lock确定的最新版本,直接将包安装进本地 .venv。
- 备份载体:将 pyproject.toml + uv.lock 提交代码仓库,无需上传庞大的 .venv 文件夹。
uv init# 初始化项目,生成pyproject.tomluvaddnumpy requests# 新增依赖,自动更新双配置文件uvsync# 对齐环境、生成/更新lock环境迁移流程
4. 拉取包含pyproject.toml、uv.lock的项目代码;
5. 进入项目目录执行uv sync,自动创建.venv,严格按照 lock 文件复现完全一致的依赖环境;
6. 生产部署剔除开发工具:uv sync --no-dev。
uvsync--no-dev# 复现环境,仅安装生产依赖删除环境
删除环境直接删除对应环境文件夹即可。
五,python cli
是什么
可直接在终端执行的 Python CLI 工具(如 uvicorn、langgraph、pip)
用来干什么
简化用户操作,避免写python -m xxx
原理
pip和setuptools
角色分工:pip是前端(负责下载、依赖解析);setuptools是一个第三方包(在site-packages中),构建后端(负责打包、编译、生成入口)。
安装策略:pip优先下载预编译的Wheel (.whl)包,本质上就是 .py 文件和的c编译文件(如.pyd/.so)的压缩包,下载后直接解压到site-packages。
编译场景:只有安装含 C 扩展的包(如 numpy)且找不到匹配的轮子时(.whl包),pip 才会下载源码包(.tar.gz),并调用setuptools在本地进行 C 编译生成二进制文件,构建临时whl包。
生成命令:在解压.whl后,pip 读取console_scripts配置(该配置是setuptools定义的打包规范,已提前写入Wheel包中), 在 bin/Scripts 目录生成可执行的启动器文件。
版本注意:Python 3.12+ 的虚拟环境不再默认预装setuptools,若需从源码安装或使用旧式命令,需手动pip install setuptools。
核心流程
开发者本地编码 → 配置
console_scripts(推荐,使用pyproject.toml) → 调用setuptools打包成.whl等文件 → 上传到 PyPI 服务器。打包时,
setuptools不会把pyproject.toml原封不动地塞进.whl包里。它会读取[project.scripts]里的配置,然后将其翻译成Wheel包标准规范要求的格式,存放在.whl包内的元数据文件夹里。# pyproject.toml 案例[project]name="my-tool"version="0.1.0"# 核心配置在这里[project.scripts]mycli="my_package.cli:main"项目目录
my-tool/ ├── pyproject.toml# 或 setup.py└── my_package/# 包目录├── __init__.py └── cli.py使用者激活某个环境,执行
pip install xx安装解压.whl 包,解压完成后,pip读取并解析元数据中的console_scripts内容。生成启动脚本。(以Linux为例)#!/usr/bin/env python3# -*- coding: utf-8 -*-importreimportsysfrommy_package.cliimportmainif__name__=='__main__':sys.exit(main())并将这个启动脚本放到 scripts 目录,也就是 和解释器、pip同一目录下
使用的时候,激活环境后,终端中敲命令
mycli,bash找到启动脚本,因为启动脚本中要求python解释器来执行它,因此操作系统会在path 中找到解释器(也就是当前环境的解释器)执行这个启动脚本,程序就跑起来了。