Pip 与 UV 的主要区别
简单来说,Pip 是 Python 官方自带的、最传统的包管理工具,专注于安装、卸载和管理软件包。而 UV 是一个用 Rust 语言编写的现代化、高性能的 Python 项目和包管理器,它的目标是提供比 Pip 更快、更全面的功能,旨在整合和替代包括 pip、venv、pip-tools 在内的多个工具。
以下是它们之间几个关键的区别:
-
速度和性能 (Speed & Performance)
- UV: 这是 UV 最显著的优势。由于它是用高性能的 Rust 语言编写的,并采用了并行处理等优化技术,其安装和解析依赖的速度比 Pip 快 10 到 100 倍。对于有大量依赖的复杂项目,这种速度提升可以极大地缩短等待时间。
- Pip: Pip 是用 Python 编写的,在处理复杂的依赖关系或安装大量包时,速度会明显慢一些。
-
功能范围 (Scope of Functionality)
- UV: 它是一个集成化的工具。除了包安装(
uv pip install),它还内置了虚拟环境管理(uv venv)、项目脚手架(uv init)、在虚拟环境中运行命令(uv run)和依赖树查看(uv tree)等功能。你只需要一个uv命令就可以完成过去需要pip+venv+pipdeptree等多个工具组合才能完成的工作。 - Pip: 它的核心功能是包管理。创建和管理虚拟环境需要依赖 Python 自带的
venv模块,而查看依赖树则需要额外安装像pipdeptree这样的第三方库。
- UV: 它是一个集成化的工具。除了包安装(
-
依赖解析与可复现性 (Dependency Resolution & Reproducibility)
- UV: UV 使用更现代的依赖解析器,能更高效、更准确地处理复杂的依赖冲突。它通过
pyproject.toml和uv.lock文件来锁定项目依赖的精确版本,这确保了团队中每个成员或在不同环境(如开发、测试、生产)中都能安装完全相同的包版本,避免了“在我电脑上能跑”的问题,保证了项目的可复现性。 - Pip: Pip 的传统工作流依赖于
requirements.txt文件,这个文件通常由pip freeze生成。虽然可以指定版本,但它在处理复杂依赖和确保环境一致性方面不如 UV 的锁定文件机制强大和可靠。
- UV: UV 使用更现代的依赖解析器,能更高效、更准确地处理复杂的依赖冲突。它通过
-
易用性 (Ease of Use)
- UV: 通过
uv init和uv run等命令,极大地简化了新项目的启动和脚本的运行流程,对新手非常友好。 - Pip: 作为 Python 的标配,它非常成熟且被广泛使用,几乎所有的教程和项目都会涉及到它,兼容性极佳。
- UV: 通过
命令列表对比
下面的表格列出了 Pip 和 UV 在常用功能上的命令对比。请注意,这并非两个工具的全部命令,但涵盖了绝大多数日常开发场景。
| 功能 (Functionality) | Pip 命令 | UV 命令 | 备注 (Notes) |
|---|---|---|---|
| 安装包 | pip install <package> | uv pip install <package> | UV 兼容大部分 Pip 命令,可以直接替换。 |
| 从文件安装 | pip install -r requirements.txt | uv pip install -r requirements.txt | 两者都支持从需求文件安装。 |
| 卸载包 | pip uninstall <package> | uv pip uninstall <package> | 卸载包的命令也保持一致。 |
| 列出已安装的包 | pip list | uv pip list | 查看当前环境中已安装的所有包。 |
| 生成依赖列表 | pip freeze > requirements.txt | uv pip freeze > requirements.txt | uv lock 命令可以生成更可靠的 uv.lock 锁定文件。 |
| 创建虚拟环境 | python -m venv .venv | uv venv | UV 的命令更简洁,并且可以自动发现并使用。 |
| 初始化项目 | (无直接命令) | uv init | UV 可以一键生成包含 pyproject.toml 等文件的标准项目结构。 |
| 在虚拟环境中运行脚本 | source .venv/bin/activatepython <script.py> | uv run <script.py> | UV 无需手动激活环境,一步到位,非常方便。 |
| 查看依赖树 | pip install pipdeptreepipdeptree | uv tree | UV 内置了此功能,而 Pip 需要安装额外的库。 |
pip 命令列表
pip 主要用于管理项目或系统环境中已安装的 Python 包。
| 操作 | 命令格式 | 示例 | 说明 |
|---|---|---|---|
| 安装包 | pip install <package-name> | pip install requests | 从 PyPI 安装一个包。 |
| 安装特定版本 | pip install <package-name>==<version> | pip install django==3.2.12 | 安装一个包的精确版本。 |
| 升级包 | pip install --upgrade <package-name> | pip install --upgrade requests | 将指定的包升级到最新版本。 |
| 从文件安装 | pip install -r <file-name> | pip install -r requirements.txt | 从一个需求文件中安装所有列出的包,这是项目依赖管理的核心。 |
| 卸载包 | pip uninstall <package-name> | pip uninstall requests | 卸载一个已经安装的包。 |
| 列出已安装的包 | pip list | pip list | 显示当前环境中所有已安装的包及其版本。 |
| 检查可更新的包 | pip list --outdated | pip list --outdated | 列出所有可以升级的包。 |
| 显示包信息 | pip show <package-name> | pip show django | 显示特定包的详细信息,如版本、依赖、安装位置等。 |
| 生成需求文件 | pip freeze > <file-name> | pip freeze > requirements.txt | 将当前环境中所有已安装的包及其精确版本输出到文件中。 |
| 搜索包 | pip search <query> | pip search beautifulsoup | 注意: 此命令因性能问题已被官方弃用。推荐直接在 PyPI 官网 上搜索。 |
npx 命令列表
npx 的命令相对简单,因为它只有一个核心职责:执行。它的强大之处在于其灵活的执行方式和参数。
| 操作 | 命令格式 | 示例 | 说明 |
|---|---|---|---|
| 执行远程包 | npx <command> | npx create-react-app my-react-app | 如果本地没有 create-react-app 命令,npx 会从 npm 仓库临时下载它,运行,然后在命令结束后清理。这是最常见的用法。 |
| 执行特定版本的包 | npx <package>@<version> <command> | npx create-react-app@4.0.3 my-old-app | 临时下载并运行指定版本的包。非常适合测试旧版本的脚手架。 |
| 执行本地项目中的命令 | npx <command> | npx eslint . --fix | 如果你在项目里安装了 eslint (pnpm add -D eslint),npx 会优先执行项目 node_modules/.bin 目录下的 eslint,避免了全局安装的需要。 |
| 执行任意代码片段 | npx -p <package> <command> | npx -p cowsay cowsay "Hello Gemini" | -p 参数指定要使用的包。此命令会临时安装 cowsay 包,并用它来执行 cowsay "Hello Gemini" 命令。 |
| 避免使用缓存 | npx --ignore-existing <command> | npx --ignore-existing create-react-app my-app | 强制 npx 重新下载包,而不是使用其内部缓存中的版本。 |
| 执行 GitHub 仓库代码 | npx github:<user>/<repo> [args] | npx github:piuccio/cowsay hello | 直接从 GitHub 仓库执行包。 |
Yarn 的常用命令列表
值得注意的是,Yarn 有两个主流版本:Yarn 1 (Classic) 和 Yarn 2+ (Berry)。它们的某些命令和工作方式有所不同。下表将主要基于更现代且被推荐的 Yarn 2+ 版本,同时也会对 Yarn 1 的差异进行说明。
Yarn需要主动安装。 和 pnpm 一样,Yarn 也是一个独立的包管理工具,需要通过 npm 或其他方式在你的系统中进行安装。
Yarn 常用命令列表
| 操作 | 命令格式 (Yarn 2+) | 示例 | 说明 |
|---|---|---|---|
| 全局安装 Yarn | npm install -g yarn | npm install -g yarn | 这是安装 Yarn 1 (Classic) 的方式。安装后,你可以用它来管理项目或升级到 Yarn 2+。 |
| 在项目中启用 Yarn 2+ | yarn set version berry | yarn set version berry | 在一个由 Yarn 1 管理的项目中,运行此命令会将该项目升级到最新稳定版的 Yarn (Berry),并生成 .yarnrc.yml 文件。这是官方推荐的用法。 |
| 安装项目依赖 | yarn install 或 yarn | yarn install | 读取 package.json 文件,并安装所有依赖。Yarn 2+ 会采用 PnP (Plug'n'Play) 模式,不会创建传统的 node_modules 文件夹。 |
| 安装特定包 | yarn add <pkg> <br> yarn add -D <pkg> <br> yarn global add <pkg> | yarn add axios <br> yarn add -D prettier <br> yarn global add serve | 默认添加到 dependencies。-D 表示添加到 devDependencies。global add 用于全局安装(在 Yarn 1 中更常用)。 |
| 查看包信息 | yarn info <pkg> | yarn info react | 显示一个包的详细信息,包括版本、依赖等。 |
| 搜索包 | yarn search <keyword> | yarn search form-validator | 注意: 这是 Yarn 1 的命令。Yarn 2+ 官方推荐直接在 npm 官网 或 Yarn 官网 进行搜索,因为本地搜索结果可能不准确。 |
| 更新依赖 | yarn up <br> yarn up <pkg> | yarn up <br> yarn up lodash@latest | up 是 Yarn 2+ 的更新命令。不带包名时,会根据 package.json 中的版本范围交互式地更新所有可更新的依赖。也可以指定更新某个特定的包。 |
| 检查可更新依赖 | yarn outdated | yarn outdated | 列出当前项目中所有可以更新的依赖项。 |
| 删除依赖 | yarn remove <pkg> | yarn remove moment | 从项目中移除一个包,并自动更新相关文件。 |
| 运行脚本 | yarn <script-name> | yarn dev <br> yarn lint | 和 pnpm 类似,直接运行 package.json 中 scripts 对象里定义的命令,无需 run 关键字。 |
Yarn 1 (Classic) vs Yarn 2+ (Berry) 的关键区别
-
node_modules:- Yarn 1: 创建和 npm 类似的扁平化
node_modules文件夹。 - Yarn 2+: 默认使用 Plug'n'Play (PnP) 技术,不生成
node_modules。它会生成一个.pnp.cjs文件来帮助 Node.js 定位依赖,启动速度更快,依赖关系更严格。
- Yarn 1: 创建和 npm 类似的扁平化
-
配置文件:
- Yarn 1: 使用
.yarnrc文件。 - Yarn 2+: 使用
.yarnrc.yml文件,语法为 YAML。
- Yarn 1: 使用
-
命令差异:
- 更新: Yarn 1 使用
yarn upgrade,而 Yarn 2+ 使用yarn up。 - 搜索: Yarn 1 内置
search命令,Yarn 2+ 鼓励使用网站搜索。
- 更新: Yarn 1 使用
如果你是新项目,并且团队愿意接受新的工作流,尝试 Yarn 2+ 的 PnP 模式是一个不错的选择。如果为了兼容性或习惯,Yarn 1 依然是一个非常稳定和快速的工具。
pnpm 的安装、兼容性以及常用命令。
pnpm 需要主动安装吗?
是的,pnpm 需要主动安装。
它是一个独立的包管理工具,就像 npm 和 Yarn 一样。它不会随 Node.js 默认安装。你需要通过 npm、独立脚本或其他方式在你的系统上全局安装 pnpm,之后才能在项目中使用它。
pnpm 安装的依赖与 npm 兼容吗?
是的,完全兼容。
pnpm 使用的包(依赖)本身与 npm 完全相同,都来自于同一个官方的 npm 仓库 (npm registry)。
它们之间最核心的区别在于依赖的组织和存储方式,而不是依赖包本身的内容:
- npm (v3+): 采用“扁平化”的
node_modules结构。这可能导致一些潜在问题,比如“幽灵依赖”(项目中可以引用到未在package.json中声明的包)。 - pnpm: 采用一种创新的“内容寻址”存储方式。它将所有依赖项存储在一个全局的、集中的位置(
~/.pnpm-store),然后在项目的node_modules目录中通过硬链接 (hard link) 和符号链接 (symbolic link) 的方式引用这些依赖。这种方式有三大好处:- 极致的磁盘空间节省:同一个包的同一个版本在你的电脑上只会有一份实体文件。
- 安装速度极快:如果依赖已在全局仓库中,它会直接链接,无需重新下载。
- 避免幽灵依赖:
node_modules结构更加规整,你的代码只能访问到在package.json中明确声明的依赖,让项目依赖关系更可靠。
尽管 node_modules 的内部结构不同,但对于你的应用程序和 Node.js 的模块解析机制来说,最终的效果是完全一样的。因此,一个用 pnpm 安装依赖的项目,在运行时与用 npm 安装依赖的项目是兼容的。
pnpm 常用命令列表
以下是 pnpm 的核心命令,以表格形式呈现,并附有清晰的示例。
| 操作 | 命令格式 | 示例 | 说明 |
|---|---|---|---|
| 全局安装 pnpm | npm install -g pnpm | npm install -g pnpm | 这是最常见的安装 pnpm 自身的方式。安装一次后,就可以在任何地方使用 pnpm 命令了。 |
| 安装项目依赖 | pnpm install 或 pnpm i | pnpm install | 读取当前项目中的 package.json 文件,并下载、链接所有依赖项到 node_modules。 |
| 安装特定包 | pnpm add <pkg> <br> pnpm add -D <pkg> <br> pnpm add -g <pkg> | pnpm add vue <br> pnpm add -D typescript <br> pnpm add -g vite | add 是 install 的别名。默认添加到 dependencies。-D 表示添加到 devDependencies (开发依赖)。-g 表示全局安装。 |
| 查看包信息 | pnpm view <pkg> [field] | pnpm view react version <br> pnpm view vite versions <br> pnpm view lodash | view (或 info) 用于查看 npm 仓库中某个包的详细信息,如版本号、依赖关系等。可以指定查看某个字段。 |
| 搜索包 | pnpm search <keyword> | pnpm search date-format | 在 npm 仓库中根据关键词搜索相关的包。 |
| 更新依赖 | pnpm update <br> pnpm up <br> pnpm up <pkg> | pnpm update <br> pnpm up <br> pnpm up lodash@latest | update (或 up) 会根据 package.json 中指定的版本范围,将依赖更新到最新的兼容版本。你也可以指定更新某个特定的包。 |
| 检查可更新依赖 | pnpm outdated | pnpm outdated | 列出当前项目中所有可以更新的依赖项,以及它们当前的版本和最新版本。 |
| 删除依赖 | pnpm remove <pkg> <br> pnpm rm <pkg> | pnpm remove dayjs | 从项目中移除一个包,并自动更新 package.json 和 pnpm-lock.yaml 文件。rm 是 remove 的别名。 |
| 运行脚本 | pnpm <script-name> | pnpm dev <br> pnpm build | 直接运行 package.json 中 scripts 对象里定义的命令,相比 npm,可以省略 run 关键字。 |
总结来说,pnpm 是一个现代、高效且可靠的包管理工具。它不仅解决了 npm 的一些历史痛点,还能显著提升开发效率和节省磁盘空间,因此在社区中越来越受欢迎。
VSCode Python 开发主流扩展推荐
对于绝大多数 Python 开发者而言,安装以下扩展能够显著提升代码质量、开发效率和项目管理能力。
| 扩展名称 (Marketplace ID) | 主要功能 | 推荐理由 |
|---|---|---|
Python <br/> ms-python.python | 核心支持:提供调试、Linting、代码格式化、Jupyter Notebook 支持、代码补全 (IntelliSense)、环境管理等一切 Python 开发所需的基础功能。 | 官方出品,必备基础。这是所有 Python 开发者在 VSCode 上的“第一站”,几乎所有其他 Python 相关扩展都依赖于它。提供了最全面、最稳定的 Python 开发支持。 |
Pylance <br/> ms-python.vscode-pylance | 高性能语言服务器:提供极其快速和精准的代码补全、类型检查、参数提示、代码导航和自动导入等功能。 | 极致的编码体验。Pylance 基于微软的 Pyright 静态类型检查器,其智能提示(IntelliSense)的性能和准确度远超默认的 Jedi。对于追求编码效率和代码健壮性的开发者来说是必选项。 |
Jupyter <br/> ms-toolsai.jupyter | Jupyter Notebook 支持:在 VSCode 中直接创建、编辑和运行 .ipynb 文件,无缝连接远程 Jupyter 服务器。 | 数据科学和机器学习必备。将 VSCode 的强大编辑功能与 Jupyter 的交互式计算能力完美结合,提供了比 Web 版 Jupyter 更流畅、更强大的开发体验。 |
Ruff <br/> charliermarsh.ruff | 极速 Linting 和格式化:一个用 Rust 编写的 Python Linter 和 Formatter,速度比 Flake8、isort 等传统工具快几十甚至上百倍。 | 下一代代码质量工具。Ruff 将 Linting、格式化和导入排序等功能集于一身,配置简单,性能卓越。它正在迅速成为社区的新标准,强烈推荐用于替代 Flake8、pylint、isort 和 black。 |
Black Formatter <br/> ms-python.black-formatter | 代码自动格式化:使用 Black(“The uncompromising Python code formatter”)来统一代码风格。 | 团队协作的风格统一利器。如果项目未使用 Ruff,Black 是事实上的标准格式化工具。它能自动将代码格式化为一种固定的、无争议的风格,减少代码审查中关于格式的争论。 |
Mypy Type Checker <br/> ms-python.mypy-type-checker | 静态类型检查:在编码时实时捕获类型错误,增强代码的健壮性和可维护性。 | 提升代码质量和可维护性。对于大型项目或追求代码稳定性的开发者而言,静态类型检查是不可或缺的一环。Mypy 是 Python 社区中最权威的类型检查工具。 |
Python Indent <br/> kevinrose.vsc-python-indent | 智能缩进:修复和优化 Python 代码的缩进,尤其是在复杂的代码块和多行语句中。 | 解决缩进烦恼。Python 对缩进有严格要求,这个小工具能在编写和粘贴代码时智能地处理缩进,避免了很多不必要的语法错误,虽然看似小众,但非常实用。 |
GitLens <br/> eamodio.gitlens | Git 功能增强:在编辑器中无缝集成 Git 的强大功能,如查看代码作者(blame)、提交历史、文件变更对比等。 | 版本控制的最佳搭档。虽然不是 Python 专属,但对于任何使用 Git 的项目都是神器。它能让你清晰地了解每一行代码的来龙去脉,极大提升了代码追溯和团队协作的效率。 |
Docker <br/> ms-azuretools.vscode-docker | 容器化开发支持:在 VSCode 中管理 Docker 镜像、容器,并能轻松地为 Python 项目生成 Dockerfile。 | 现代应用开发必备。对于需要将 Python 应用容器化的开发者来说,此扩展提供了便捷的图形化界面来操作 Docker,简化了开发、调试和部署流程。 |
Python Docstring Generator <br/> nils-werner.python-docstring-generator | 文档字符串:快速为函数或类生成符合规范的文档字符串 (docstring) 模板。。 | 本质是“文档规范化的助手”。良好的文档是优秀代码的一部分。这个工具可以让你一键生成标准格式(如 Google, Sphinx, NumPy 风格)的文档框架,你只需填充内容即可,保证了文档的专业性和一致性。。 |
安装建议
- 新手/基础配置:
Python+Pylance+Ruff。这个组合已经能满足绝大部分日常开发需求,兼顾了核心功能、智能提示和高效的代码质量检查。 - 数据科学/AI 开发者:在基础配置上,务必加上
Jupyter。 - 团队项目/大型项目:强烈建议加入
GitLens和Mypy Type Checker,以加强版本控制和代码的健壮性。 - 需要容器化部署:请安装
Docker扩展。
您可以直接在 VSCode 的扩展市场中搜索上述的 扩展名称 或 ID 进行安装。希望这份表格能帮助您打造一个高效、舒适的 Python 开发环境!
npm 常用命令一览
| 功能分类 | 命令 | 说明 |
|---|---|---|
| 安装 (Install) | npm install 或 npm i | 安装 package.json 文件中定义的所有依赖包。 |
npm install <package_name> | 在当前项目中安装指定的包(作为生产依赖)。 | |
npm install <package_name>@<version> | 安装指定版本的包。 | |
npm install <package_name> --save-dev 或 -D | 安装包并将其添加到 devDependencies(开发依赖)。 | |
npm install <package_name> -g | 全局安装一个包。 | |
npm ci | (Clean Install) 根据 package-lock.json 或 npm-shrinkwrap.json 精确安装依赖,通常用于持续集成环境,比 npm install 更快、更可靠。 | |
| 查看 (View) | npm list 或 npm ls | 查看当前项目安装的所有包(以树状结构显示)。 |
npm list -g --depth=0 | 查看所有全局安装的包(--depth=0 表示只显示顶层包)。 | |
npm view <package_name> | 查看一个包在 npm 仓库中的详细信息,如版本、依赖等。 | |
npm config list | 查看所有 npm 的配置信息。 | |
npm -v | 查看 npm 自身的版本号。 | |
| 更新 (Update) | npm outdated | 检查当前项目的依赖包是否有可用的更新。 |
npm update | 根据 package.json 中指定的版本范围,更新项目的所有依赖包。 | |
npm update <package_name> | 更新指定的包。 | |
npm update -g <package_name> | 更新一个全局安装的包。 | |
| 查找 (Search) | npm search <keywords> | 在 npm 仓库中搜索包含指定关键词的包。 |
npm home <package_name> | 在浏览器中打开指定包的主页。 | |
npm repo <package_name> | 在浏览器中打开指定包的 Git 仓库地址。 | |
| 删除 (Delete) | npm uninstall <package_name> 或 npm un | 从当前项目中卸载一个包。 |
npm uninstall <package_name> -g | 卸载一个全局安装的包。 | |
npm prune | 移除 node_modules 文件夹中未在 package.json 中列出的包。 | |
npm cache clean --force | 强制清除 npm 的缓存。 |
总结与反思
- 本质是什么?
npm(Node Package Manager) 的本质是一个 包管理器 和 软件注册表。它允许 JavaScript 开发者发现、共享和复用代码。它的核心是package.json文件,这个文件定义了项目的元数据和依赖关系,npm命令则围绕这个文件来管理项目的整个生命周期。 - 如何选择命令?
- 日常开发:最常用的是
npm install和npm install <package_name>。 - 团队协作/CI/CD:强烈推荐使用
npm ci来保证环境的一致性。 - 维护项目:
npm outdated和npm update是保持依赖更新的好帮手。 - 全局工具:对于像
create-react-app或vue-cli这样的脚手架工具,通常使用npm install -g进行全局安装。
- 日常开发:最常用的是
- 下一步实践建议:
- 动手尝试:创建一个新的空文件夹,执行
npm init -y初始化一个项目,然后尝试安装(install)、查看(list)、更新(update)和卸载(uninstall)一些你感兴趣的包,比如lodash或dayjs。 - 理解
dependencies与devDependencies:尝试使用--save-dev安装一些只在开发时需要的工具(如eslint、prettier),并观察package.json文件的变化。这有助于理解生产环境和开发环境的差异。 - 探索
npx:npx是一个非常有用的npm配套工具,它允许你直接运行 npm 包中的可执行文件,而无需全局安装。例如,可以尝试运行npx create-react-app my-app,体验一下它的便捷。
- 动手尝试:创建一个新的空文件夹,执行