Python
Python 版本:3.12
系统:Windows11 + WSL2(Ubuntu24.04)
编辑器:VSCode/Cursor
环境管理没有银弹
结论在前
Python环境管理工具经历了从简单到复杂,再到智能化的演进过程。每个工具都有其独特的优势和适用场景:
工具对比总览
工具 | 优点 | 缺点 | 适用场景 | 学习成本 | 性能 |
---|---|---|---|---|---|
pip + venv | • 官方标准,稳定可靠 • 轻量级,占用空间小 • 学习成本低 | • 依赖 冲突处理能力弱 • 需要手动管理requirements.txt • 不支持多Python版本管理 | • Python初学者 • 简单项目开发 • 生产环境部署 | 低 | 一般 |
Anaconda | • 预装大量科学计算包 • 支持多Python版本 • GUI界面友好 • 管理CUDA等外部依赖 | • 体积庞大(几GB) • 创建环境较慢 • 商业使用需付费 • 依赖解析不够智能 | • 机器学习/数据科学 • 科研项目 • 需要图形界面的用户 | 中等 | 慢 |
Docker | • 完全隔离的环境 • 一次构建,到处运行 • 解决所有环境问题 • 支持微服务架构 | • 资源占用大 • 100M代码变1G镜像 • 不适合低配置设备 • 增加了部署复杂度 | • 生产环境部署 • 微服务架构 • 团队协作开发 • CI/CD流水线 | 高 | 中等 |
UV | • 速度极快(10-100倍提升) • 一体化工具箱 • 智能依赖解析 • 现代化项目管理 | • 相对较新,生态待完善 • 社区支持有限 • 某些边缘情况可能不稳定 | • 现代Python开发 • 频繁创建项目 • 注重开发效率 • 个人和小团队项目 | 中等 | 极快 |
选择建议
- 初学者推荐: pip + venv → 简单可靠,官方标准
- 数据科学: Anaconda → 预装科学计算包,省时省力
- 企业级部署: Docker → 环境一致性保证,运维友好
- 现代化开发: UV → 高效 快速,未来趋势
记住,没有银弹,选择最适合你当前需求和技术栈的工具才是最好的选择。随着项目复杂度的增加,你可能需要组合使用多种工具来解决不同场景下的问题。
pip 与 venv :陪伴新手成长的标准库
最早我学习Python是在网页上,主打随时随地学习编程,它提供了一个Python 3.7
固定的环境,我只需要在线编写代码,点击运行就可以看到结果。它支持标准库外和pandas
、numpy
等常见的计算机科学库,我在这个网页上完成了Python的基础学习。
它的缺点是不支持自定义下载第三方模块,例如requests
,于是在学习爬虫的时候我开始学习创建本地环境。
在生活中,人们使用汉语、英语、法语、德语、日语等不同的语言跟不同国家的人进行交流。在使用计算机时,人们不能直接使用英语等人类的语言和计算机交流,而是使用编程语言(Programming Language)将人们的想法编写成程序,再通过执行程序控制计算机去解决各种问题。我们将这个编程语言与计算机之间的"翻译员"称为编程环境, 简称"环境"。
Python环境主要由2部分组成:解释器和模块库?。环境管理的重点就是如何管理这些依赖,如何保证不同的模块库之间的兼容性,如何保证不同的模块库之间的可复用性。。
在 Windows 下安装 Python 是一件非常简单的事情,Python 官网下载网址提供了windows安装的可执行文件,安装过程全部勾选,一路点击下一步就可以了。
如果我们安装了中文语言包,那么我们的系统就可以识别与显示中文。 如果我们安装了 Python 语言包,那么我们的系统就可以识别与运行 Python 程序。
安装模块也只需要使用pip
下载安装包就可以了,如果遇到网络报错那就更换镜像源?,如果没有网络那就提前下载离线wheel
,使用U盘安装。
在部分系统预装版如Ubuntu、MacOS 中,python
名为 python3
,pip
为 pip3
,Python 安装完成后,pip 也会自动安装完成。
但是随着我学习的内容越来越复杂,我安装的包出现了依赖项冲突。公司的项目中用到的一个包需要requests
小于某个版本,而我正在学习的一个新框架需要requests
大于某个版本。
于是我使用venv
专门为我学习的新框架创建了一个虚拟环境,这样就避免了依赖项冲突。一切看起来很好。
当时我买的机械革命电脑系统经常蓝屏,于是我决定换一台新电脑,我使用pip freeze > requirements.txt
导出所有包,然后把requirements.txt
拷贝到新电脑上,切换到 requirements.txt 文件所在的目录下执行pip install -r requirements.txt
安装所有包。
理论上我这个操作应该可以直接顺畅的安装,但是居然报错了?这就是pip
最被诟病的依赖项冲突问题。
依赖项冲突是指同一个包的不同 版本要求不兼容,导致无法同时满足所有依赖的情况。
这是因为pip freeze
按字母顺序排列包,不考虑依赖关系。例如,包A依赖包B的1.0版本,但在安装时可能先安装了包B的2.0版本,导致依赖冲突。解决方案是根据报错手动把有冲突的包注释掉,单独安装。这并不智能。
Anaconda :与机器学习互相成就
Anaconda
、Miniconda
、conda
是什么?
- 最核心的是
conda
,它是一个包和环境管理器,可以创建和管理虚拟环境。它是开源免费的。 Miniconda
=conda
+Python
Anaconda
=Miniconda
+ 1500+预装包 + GUI界面 + 账户登录配置云同步
我用的是完整版的Anaconda
,它既预装了大量机器学习包免去重复安装,也可以创建不同版本的 Python 解释器环境?,还可以管理 CUDA 这样的外部包。而且在Linux环境下安装和管理多个原生Python不算方便,有了conda
之后就方便很多了。
可以说Anaconda
推动了机器学习的发展,机器学习也让Anaconda
广为人知。
但 conda
创建环境真的很慢,而且体积很大,并且处理依赖冲突的时候也并不算智能。但是让一些公司真正放弃Anaconda
的原因是商业付费,而 且售后不足。
Docker:以空间换时间
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖打包成一个独立的容器,然后在任何有docker的地方运行。是开发者的终极梦想。
上面这句话应该会招来硬件工程师的反馈,因为docker会占据相当的内存空间和硬盘空间。通常内存小于2G的设备或边缘设备,例如树莓派、一些轻量服务器,是不适合安装docker的。另外docker原理是把系统环境和项目一起打包成一个镜像,然后运行时再解包,这会占用更多空间,我们的不含模型的代码一般都在100M以内,如果使用docker,那么100M的代码会变成1G的镜像。
docker是很典型的用空间换时间,它让开发者在任何地方都可以运行代码,而且不用担心环境问题。你可以节省1个运维工程师,只需要给你的电脑升级一下配置?。
如果你的容器很多,可以使用docker-compose和K8s,可以说中大型公司软件开发,容器化是主流。
UV:整合多个工具的工具箱
docker
和conda
解决了开发和部署问题,但是依赖项冲突问题依然需要一个更加聪明的解决方案,不能总是 手动解决冲突。而且对于总是去陌生客户场地出差的人来说,总是需要先吃顿饭来等待docker
和conda
安装。有没有一个更加轻快的解决方案?
有需求就有市场,Poetry
、pipx
、Pixi
、uv
等工具开始了他们的探索,总体方向是:更快、更集成、更智能。
你可以选择任意一个工具箱或者都不选择,如果要选的话,我个人比较推荐uv
,它吸取了各家之长,目前看来是最好用的工具箱。?
因为对于专业的开发者来说,绝大部分时间我们都是在创建项目、发布项目、查看别人的项目并在本地复现,这些操作比较频繁。每周 uv
能为你节省 1 ~ 5 个小时,要知道我每周才工作 35 ~ 40 个小时!
下面是uv的常用命令示例,按项目构建顺序整理,可以参考。
# 安装uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# 一键安装多个python版本,支持多个来源
uv python install 3.10 3.11 3.12
# 锁定Python版本(设置默认的Python版本)
uv python pin 3.12
# 初始化项目时可以指定 Python 版本,自动添加README.md、.git与.gitignore文件
uv init example --python 3.12
# 进入项目
cd example
# 查看当前项目使用的Python版本
uv python find
# 添加包时会自动创建venv环境,同时更新项目依赖文件pyproject.toml,无需python -m venv,无需反复pip freeze
uv add ruff
# 自动检查代码格式
uv run ruff check
# 根据pyproject.toml安装项目依赖
uv sync
# 快速打包和发布项目
uv build
uv publish
# 锁定关键项目依赖。锁文件的机制也许是源自npm,它让依赖冲突问题有了更智能的解决方案
uv lock
# 快速运行脚本,无需切换到虚拟环境
uv run xx.py
# 初始化一个 FastAPI 项目
uv init --app
# 快速启动项目
uv run fastapi dev
UV 命令完整参考表
基于uv官方文档的 UV 代表性命令参考表(不含完整参数)
Python版本管理
命令 | 功能描述 |
---|---|
uv python install | 安装Python版本 |
uv python list | 查看可用的Python版本 |
uv python find | 查找已安装的Python版本 |
uv python pin | 将当前项目固定到特定Python版本 |
uv python uninstall | 卸载Python版本 |
脚本执行
命令 | 功能描述 |
---|---|
uv run | 运行脚本 |
uv add --script | 为脚本添加依赖 |
uv remove --script | 从脚本中移除依赖 |
项目管理
命令 | 功能描述 |
---|---|
uv init | 创建新的Python项目 |
uv add | 向项目添加依赖 |
uv remove | 从项目中移除依赖 |
uv sync | 同步项目依赖到环境 |
uv lock | 为项目依赖创建锁定文件 |
uv run | 在项目环境中运行命令 |
uv tree | 查看项目的依赖树 |
uv build | 将项目构建为分发包 |
uv publish | 将项目发布到包索引 |
工具管理
命令 | 功能描述 |
---|---|
uvx / uv tool run | 在临时环境中运行工具 |
uv tool install | 全局安装工具 |
uv tool uninstall | 卸载工具 |
uv tool list | 列出已安装的工具 |
uv tool update-shell | 更新shell以包含工具可执行文件 |
pip与venv接口兼容
命令 | 功能描述 |
---|---|
uv venv | 创建新的虚拟环境 |
uv pip install | 将包安装到当前环境 |
uv pip show | 显示已安装包的详细信息 |
uv pip freeze | 列出已安装的包及其版本 |
uv pip check | 检查当前环境是否有兼容的包 |
uv pip list | 列出已安装的包 |
uv pip uninstall | 卸载包 |
uv pip tree | 查看环境的依赖树 |
依赖锁定
命令 | 功能描述 |
---|---|
uv pip compile | 将需求编译到锁定文件 |
uv pip sync | 将环境与锁定文件同步 |
实用工具
命令 | 功能描述 |
---|---|
uv cache clean | 移除缓存条目 |
uv cache prune | 移除过期的缓存条目 |
uv cache dir | 显示uv缓存目录路径 |
uv tool dir | 显示uv工具目录路径 |
uv python dir | 显示uv已安装Python版本路径 |
uv self update | 将uv更新到最新版本 |
编辑器
- VSCode(Visual Studio Code)是一款通用跨平台的编辑器
它不会运行程序,它需要安装相应的语言包才能运行程序。它可以编辑任何语言的程序,支持几乎所有主流的开发语言的语法高亮、智能代码补全等。安装过程全部勾选。
- 注意与 Visual Studio 区别
推荐扩展
使用 VSCode 或 Cursor,安装以下扩展:
扩展名称 | 功能描述 |
---|---|
Remote - SSH | 通过SSH连接远程服务器,在本地编辑远程文件 |
Python | 提供Python语言基础支持,包括语法高亮、代码补全和格式化 |
Pylance | 高性能Python语言服务器,提供类型检查和智能提示 |
Python Debugger | 支持Python代码的断点调试、变量监控和单步执行 |
Black Formatter | 自动格式化Python代码,保持一致的代码风格 |
Jupyter | 提供Jupyter Notebook支持,支持在VSCode中编辑和运行Jupyter Notebook |
Error Lens | 直接在代码行内展示错误和警告信息,无需悬停鼠标 |
Office Viewer | 在VSCode中直接预览Word、Excel等Office文档 |
Markmap | 以思维导图的形式展示markdown结构 |
Markdown All in One | 提供Markdown编辑、预览、导出等功能 |
SQLite Viewer | 提供SQLite数据库的可视化界面,支持数据浏览和查询 |
Hex Editor | 提供十六进制编辑器,支持编辑二进制文件 |
Live Server | 提供本地开发服务器,支持实时预览和自动刷新网页 |
Git History | 提供Git历史记录的可视化界面,支持查看文件的修改历史 |
Gitmoji | 在VSCode中使用Gitmoji,支持在提交时使用Gitmoji |
Docker | 管理Docker容器,支持创建、运行和调试容器化应用 |
CMake Tools | 提供CMake项目支持,简化C/C++跨平台构建配置 |
工作区的概念
工作区是你项目文件的集合,可以包含一个或多个文件夹。
操作类型 | 功能 | 快捷键/操作方式 |
---|---|---|
打开工作区 | 打开文件夹 | Ctrl + K, Ctrl + O 或 文件 > 打开文件夹 |
打开工作区文件 | Ctrl + K, Ctrl + W 或双击 .code-workspace 文件 | |
管理工作区 | 添加文件夹到工作区 | 文件 > 将文件夹添加到工作区 |
保存工作区 | 文件 > 将工作区另存为 (生成 .code-workspace 文件) | |
移除文件夹 | 右键文件夹 > 从工作区中删除文件夹 | |
工作区设置 | 独立设置 | 每个工作区可以有独立的设置 (.vscode/settings.json ) |
扩展和主题 | 可以为不同项目配置不同的扩展和主题 |
编辑器操作
操作类型 | 功能 | 快捷键 |
---|---|---|
视图控制 | 放大 | Ctrl + + 或 Ctrl + 滚轮上 |
缩小 | Ctrl + - 或 Ctrl + 滚轮下 | |
重置缩放 | Ctrl + 0 | |
快速导航 | 跳转到指定行 | Ctrl + G (输入行号) |
跳转到文件开头 | Ctrl + Home | |
跳转到文件结尾 | Ctrl + End | |
跳转到匹配的括号 | Ctrl + Shift + \ | |
分屏操作 | 垂直分屏 | Ctrl + \ |
关闭当前编辑器 | Ctrl + W | |
切换编辑器组 | Ctrl + 1/2/3 | |
在组间移动文件 | Ctrl + Alt + ←/→ | |
文件操作 | 新建文件 | Ctrl + N |
保存文件 | Ctrl + S | |
保存所有文件 | Ctrl + K, S | |
关闭文件 | Ctrl + W | |
重新打开已关闭的文件 | Ctrl + Shift + T |
命令框
命令框是编辑器最强大的功能之一,按 Ctrl + P
打开。
搜索模式详解
前缀 | 功能 | 快捷键 | 使用示例 |
---|---|---|---|
无前缀 | 文件搜索 | Ctrl + P | app.py *.js |
> | 命令搜索 | Ctrl + Shift + P | >Python: Run File |
@ | 当前文件符号 | Ctrl + Shift + O | @function_name |
# | 工作区符号 | Ctrl + T | #ClassName |
: | 跳转行号 | Ctrl + G | :25 |
? | 帮助信息 | 无 | ?shortcuts |
实用技巧
技巧 | 说明 | 操作方式 |
---|---|---|
模糊搜索 | 文件搜索支持模糊匹配 | 输入 apy 可以找到 app.py |
模式切换 | 从命令模式切换到文件搜索 | 按 Backspace 删除 > 符号 |
最近文件 | 查看最近打开的文件和文件夹 | Ctrl + R |
符号搜索 | 在大文件中快速定位函数、类、变量 | 使用 @ 和 # 前缀搜索 |
搜索和替换
操作类型 | 功能 | 快捷键 |
---|---|---|
基本搜索 | 当前文件搜索 | Ctrl + F |
全局搜索 | Ctrl + Shift + F | |
查找下一个 | F3 或 Enter | |
查找上一个 | Shift + F3 | |
替换操作 | 当前文件替换 | Ctrl + H |
全局替换 | Ctrl + Shift + H | |
替换当前匹配 | Ctrl + Shift + 1 | |
替换所有匹配 | Ctrl + Alt + Enter | |
高级选项 | 区分大小写 | 点击 Aa 按钮或 Alt + C |
全词匹配 | 点击 Ab 按钮或 Alt + W | |
正则表达式 | 点击 .* 按钮或 Alt + R |
正则表达式示例
\d+ ## 匹配数字
[a-zA-Z]+ ## 匹配字母
\w+\s*=\s* ## 匹配变量赋值
function\s+(\w+) ## 匹配函数定义
搜索技巧
技巧 | 说明 | 示例 |
---|---|---|
排除文件夹 | 在搜索框中添加排除规则 | !node_modules |
指定文件类型 | 只搜索特定类型文件 | *.py 只搜索Python文件 |
使用占位符 | 替换时引用正则分组 | 用 $1 $2 引用正则分组 |
调试功能
操作类型 | 功能 | 快捷键/操作方式 |
---|---|---|
断点操作 | 设置/取消断点 | 点击行号左侧或 F9 |
条件断点 | 右键行号 > 添加条件断点 | |
日志断点 | 右键行号 > 添加记录点 | |
禁用断点 | 右键断点 > 禁用断点 | |
调试控制 | 开始调试 | F5 |
开始执行(不附加调试器) | Ctrl + F5 | |
停止调试 | Shift + F5 | |
重启调试 | Ctrl + Shift + F5 | |
继续执行 | F5 | |
单步跳过 | F10 | |
单步跳入 | F11 | |
单步跳出 | Shift + F11 | |
调试面板 | 变量 | 查看当前作用域的变量值 |
监视 | 添加表达式进行实时监控 | |
调用堆栈 | 查看函数调用链 | |
断点 | 管理所有断点 |
调试控制台
调试暂停时,可以 在控制台中执行以下操作:
操作 | 说明 | 示例 |
---|---|---|
查看变量值 | 直接输入变量名 | my_variable |
执行表达式 | 运行计算表达式 | len(my_list) |
修改变量 | 动态修改变量值 | my_var = new_value |
调用函数 | 执行函数调用 | my_function() |
多光标编辑
多光标功能大幅提升编辑效率。
操作类型 | 功能 | 快捷键 |
---|---|---|
创建多光标 | 按住Alt点击 | 在任意位置添加光标 |
选择下一个相同单词 | Ctrl + D | |
选择所有相同单词 | Ctrl + Shift + L | |
在选中区域每行末尾添加光标 | Alt + Shift + I | |
列选择模式 | 矩形选择 | Shift + Alt + 鼠标拖拽 |
向下/上扩展列选择 | Ctrl + Shift + Alt + ↓/↑ | |
向左/右扩展列选择 | Ctrl + Shift + Alt + ←/→ | |
多光标技巧 | 撤销最后一个光标 | Ctrl + U |
跳过当前选择 | Ctrl + K, Ctrl + D | |
选择所有匹配项 | Ctrl + Shift + L |
实用场景
## 同时修改多个变量名
old_name = 1
old_name = 2 ## Ctrl+D选择所有old_name,直接输入new_name
old_name = 3
代码格式化
操作类型 | 功能 | 快捷键 |
---|---|---|
注释操作 | 切换行注释 | Ctrl + / |
切换块注释 | Shift + Alt + A | |
批量注释选中行 | 选中多行后 Ctrl + / | |
缩进操作 | 增加缩进 | Tab 或 Ctrl + ] |
减少缩进 | Shift + Tab 或 Ctrl + [ | |
自动调整缩进 | Ctrl + Shift + I | |
代码格式化 | 格式化整个文档 | Shift + Alt + F |
格式化选中代码 | Ctrl + K, Ctrl + F | |
保存时自动格式化 | 设置中启用 Format On Save | |
代码折叠 | 折叠当前块 | Ctrl + Shift + [ |
展开当前块 | Ctrl + Shift + ] | |
折叠所有 | Ctrl + K, Ctrl + 0 | |
展开所有 | Ctrl + K, Ctrl + J |
禅模式
禅模式提供无干扰的编程环境,适合专注编码。
操作类型 | 功能 | 操作方式 |
---|---|---|
进入禅模式 | 快捷键 | Ctrl + K, Z |
菜单 | 查看 > 外观 > 禅模式 | |
退出禅模式 | 按键 | 按两次 Esc 键 |
快捷键 | 再次按 Ctrl + K, Z |
禅模式特点
特点 | 说明 |
---|---|
隐藏UI元素 | 隐藏所有UI元素(侧边栏、状态栏、面板) |
全屏显示 | 全屏显示代码编辑器 |
居中布局 | 居中显示代码内容 |
可自定义 | 可自定义禅模式设置 |
禅模式设置
在设置中搜索 zen
可以配置:
设置项 | 功能 |
---|---|
zenMode.centerLayout | 是否居中布局 |
zenMode.fullScreen | 是否全屏显示 |
zenMode.hideLineNumbers | 是否隐藏行号 |
zenMode.hideTabs | 是否隐藏标签页 |
其他实用功能
操作类型 | 功能 | 快捷键/操作方式 |
---|---|---|
快速操作 | 复制行 | Shift + Alt + ↓/↑ |
移动行 | Alt + ↓/↑ | |
删除行 | Ctrl + Shift + K | |
在上方插入行 | Ctrl + Shift + Enter | |
在下方插入行 | Ctrl + Enter | |
选择操作 | 选择整行 | Ctrl + L |
扩展选择 | Shift + Alt + → | |
收缩选择 | Shift + Alt + ← | |
选择到行尾 | Shift + End | |
选择到行首 | Shift + Home | |
面板管理 | 切换侧边栏 | Ctrl + B |
切换面板 | Ctrl + J | |
切换终端 | Ctrl + ~ | |
切换输出面板 | Ctrl + Shift + U | |
文件浏览器 | 新建文件 | 点击文件夹右侧的 + 图标 |
新建文件夹 | Ctrl + Shift + 新建文件夹 | |
重命名 | F2 或右键选择重命名 | |
删除 | Delete 键或右键删除 |
小贴士
功能 | 说明 | 操作方式 |
---|---|---|
自定义快捷键 | 修改或添加快捷键 | 文件 > 首选项 > 键盘快捷方式 |
设置同步 | 同步设置、扩展、快捷键 | 登录账户后自动同步 |
工作区推荐扩展 | 为项目配置推荐扩展 | 在 .vscode/extensions.json 中配置 |
代码片段 | 创建自定义代码片段 | Ctrl + Shift + P 搜索 snippet |
颜色主题 | 快速切换主题 | Ctrl + K, Ctrl + T |
字体大小 | 调整字体大小 | Ctrl + +/- 临时调整,settings.json 中修改 editor.fontSize 永久设置 |
终端补全
终端中出现自动补全提示时,可以通过以下方式接受补全:右箭头键 (→) 或 Tab键
个性化设置
设置项 | 说明 | 操作方式 |
---|---|---|
主题颜色 | 选择喜欢的主题颜色 | 设置中点击主题颜色,推荐 深色+ |
保存时自动格式化 | 保存文件时自动格式化代码 | 设置中搜索 format on save ,勾选即可 |
运行代码
测试:在 Vscode 中新建一个 xxx.py 文 件,输入以下内容:
print("hello world")
运行方式 | 操作方法 | 说明 |
---|---|---|
方式1 | 点击右上角的三角形运行按钮 | GUI界面运行 |
方式2 | 在终端输入 python xxx.py | 直接运行 |
方式3 | 在终端输入 python -m xxx.py | 把模块当作脚本来启动 |
可以看到输出结果为 hello world
。
两种运行方式的区别
运行方式 | 说明 | __name__ 的值 |
---|---|---|
python xxx.py | 直接运行 | '__main__' |
python -m xxx.py | 把模块当作脚本来启动 | '__main__' |