命令与扩展

267 阅读18分钟

Pip 与 UV 的主要区别

简单来说,Pip 是 Python 官方自带的、最传统的包管理工具,专注于安装、卸载和管理软件包。而 UV 是一个用 Rust 语言编写的现代化、高性能的 Python 项目和包管理器,它的目标是提供比 Pip 更快、更全面的功能,旨在整合和替代包括 pipvenvpip-tools 在内的多个工具。

以下是它们之间几个关键的区别:

  1. 速度和性能 (Speed & Performance)

    • UV: 这是 UV 最显著的优势。由于它是用高性能的 Rust 语言编写的,并采用了并行处理等优化技术,其安装和解析依赖的速度比 Pip 快 10 到 100 倍。对于有大量依赖的复杂项目,这种速度提升可以极大地缩短等待时间。
    • Pip: Pip 是用 Python 编写的,在处理复杂的依赖关系或安装大量包时,速度会明显慢一些。
  2. 功能范围 (Scope of Functionality)

    • UV: 它是一个集成化的工具。除了包安装(uv pip install),它还内置了虚拟环境管理(uv venv)、项目脚手架(uv init)、在虚拟环境中运行命令(uv run)和依赖树查看(uv tree)等功能。你只需要一个 uv 命令就可以完成过去需要 pip + venv + pipdeptree 等多个工具组合才能完成的工作。
    • Pip: 它的核心功能是包管理。创建和管理虚拟环境需要依赖 Python 自带的 venv 模块,而查看依赖树则需要额外安装像 pipdeptree 这样的第三方库。
  3. 依赖解析与可复现性 (Dependency Resolution & Reproducibility)

    • UV: UV 使用更现代的依赖解析器,能更高效、更准确地处理复杂的依赖冲突。它通过 pyproject.tomluv.lock 文件来锁定项目依赖的精确版本,这确保了团队中每个成员或在不同环境(如开发、测试、生产)中都能安装完全相同的包版本,避免了“在我电脑上能跑”的问题,保证了项目的可复现性。
    • Pip: Pip 的传统工作流依赖于 requirements.txt 文件,这个文件通常由 pip freeze 生成。虽然可以指定版本,但它在处理复杂依赖和确保环境一致性方面不如 UV 的锁定文件机制强大和可靠。
  4. 易用性 (Ease of Use)

    • UV: 通过 uv inituv run 等命令,极大地简化了新项目的启动和脚本的运行流程,对新手非常友好。
    • Pip: 作为 Python 的标配,它非常成熟且被广泛使用,几乎所有的教程和项目都会涉及到它,兼容性极佳。

命令列表对比

下面的表格列出了 Pip 和 UV 在常用功能上的命令对比。请注意,这并非两个工具的全部命令,但涵盖了绝大多数日常开发场景。

功能 (Functionality)Pip 命令UV 命令备注 (Notes)
安装包pip install <package>uv pip install <package>UV 兼容大部分 Pip 命令,可以直接替换。
从文件安装pip install -r requirements.txtuv pip install -r requirements.txt两者都支持从需求文件安装。
卸载包pip uninstall <package>uv pip uninstall <package>卸载包的命令也保持一致。
列出已安装的包pip listuv pip list查看当前环境中已安装的所有包。
生成依赖列表pip freeze > requirements.txtuv pip freeze > requirements.txtuv lock 命令可以生成更可靠的 uv.lock 锁定文件。
创建虚拟环境python -m venv .venvuv venvUV 的命令更简洁,并且可以自动发现并使用。
初始化项目(无直接命令)uv initUV 可以一键生成包含 pyproject.toml 等文件的标准项目结构。
在虚拟环境中运行脚本source .venv/bin/activate
python <script.py>
uv run <script.py>UV 无需手动激活环境,一步到位,非常方便。
查看依赖树pip install pipdeptree
pipdeptree
uv treeUV 内置了此功能,而 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 listpip list显示当前环境中所有已安装的包及其版本。
检查可更新的包pip list --outdatedpip 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+)示例说明
全局安装 Yarnnpm install -g yarnnpm install -g yarn这是安装 Yarn 1 (Classic) 的方式。安装后,你可以用它来管理项目或升级到 Yarn 2+。
在项目中启用 Yarn 2+yarn set version berryyarn set version berry在一个由 Yarn 1 管理的项目中,运行此命令会将该项目升级到最新稳定版的 Yarn (Berry),并生成 .yarnrc.yml 文件。这是官方推荐的用法。
安装项目依赖yarn installyarnyarn 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 表示添加到 devDependenciesglobal 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@latestup 是 Yarn 2+ 的更新命令。不带包名时,会根据 package.json 中的版本范围交互式地更新所有可更新的依赖。也可以指定更新某个特定的包。
检查可更新依赖yarn outdatedyarn outdated列出当前项目中所有可以更新的依赖项。
删除依赖yarn remove <pkg>yarn remove moment从项目中移除一个包,并自动更新相关文件。
运行脚本yarn <script-name>yarn dev <br> yarn lint和 pnpm 类似,直接运行 package.jsonscripts 对象里定义的命令,无需 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: 使用 .yarnrc 文件。
    • Yarn 2+: 使用 .yarnrc.yml 文件,语法为 YAML。
  • 命令差异:

    • 更新: Yarn 1 使用 yarn upgrade,而 Yarn 2+ 使用 yarn up
    • 搜索: Yarn 1 内置 search 命令,Yarn 2+ 鼓励使用网站搜索。

如果你是新项目,并且团队愿意接受新的工作流,尝试 Yarn 2+ 的 PnP 模式是一个不错的选择。如果为了兼容性或习惯,Yarn 1 依然是一个非常稳定和快速的工具。

pnpm 的安装、兼容性以及常用命令。

pnpm 需要主动安装吗?

是的,pnpm 需要主动安装。

它是一个独立的包管理工具,就像 npm 和 Yarn 一样。它不会随 Node.js 默认安装。你需要通过 npm、独立脚本或其他方式在你的系统上全局安装 pnpm,之后才能在项目中使用它。

pnpm 安装的依赖与 npm 兼容吗?

是的,完全兼容。

pnpm 使用的包(依赖)本身与 npm 完全相同,都来自于同一个官方的 npm 仓库 (npm registry)。

它们之间最核心的区别在于依赖的组织和存储方式,而不是依赖包本身的内容:

  1. npm (v3+): 采用“扁平化”的 node_modules 结构。这可能导致一些潜在问题,比如“幽灵依赖”(项目中可以引用到未在 package.json 中声明的包)。
  2. pnpm: 采用一种创新的“内容寻址”存储方式。它将所有依赖项存储在一个全局的、集中的位置(~/.pnpm-store),然后在项目的 node_modules 目录中通过硬链接 (hard link) 和符号链接 (symbolic link) 的方式引用这些依赖。这种方式有三大好处:
    • 极致的磁盘空间节省:同一个包的同一个版本在你的电脑上只会有一份实体文件。
    • 安装速度极快:如果依赖已在全局仓库中,它会直接链接,无需重新下载。
    • 避免幽灵依赖node_modules 结构更加规整,你的代码只能访问到在 package.json 中明确声明的依赖,让项目依赖关系更可靠。

尽管 node_modules 的内部结构不同,但对于你的应用程序和 Node.js 的模块解析机制来说,最终的效果是完全一样的。因此,一个用 pnpm 安装依赖的项目,在运行时与用 npm 安装依赖的项目是兼容的。

pnpm 常用命令列表

以下是 pnpm 的核心命令,以表格形式呈现,并附有清晰的示例。

操作命令格式示例说明
全局安装 pnpmnpm install -g pnpmnpm install -g pnpm这是最常见的安装 pnpm 自身的方式。安装一次后,就可以在任何地方使用 pnpm 命令了。
安装项目依赖pnpm installpnpm ipnpm 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 viteaddinstall 的别名。默认添加到 dependencies-D 表示添加到 devDependencies (开发依赖)。-g 表示全局安装。
查看包信息pnpm view <pkg> [field]pnpm view react version <br> pnpm view vite versions <br> pnpm view lodashview (或 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@latestupdate (或 up) 会根据 package.json 中指定的版本范围,将依赖更新到最新的兼容版本。你也可以指定更新某个特定的包。
检查可更新依赖pnpm outdatedpnpm outdated列出当前项目中所有可以更新的依赖项,以及它们当前的版本和最新版本。
删除依赖pnpm remove <pkg> <br> pnpm rm <pkg>pnpm remove dayjs从项目中移除一个包,并自动更新 package.jsonpnpm-lock.yaml 文件。rmremove 的别名。
运行脚本pnpm <script-name>pnpm dev <br> pnpm build直接运行 package.jsonscripts 对象里定义的命令,相比 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.jupyterJupyter 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.gitlensGit 功能增强:在编辑器中无缝集成 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
  • 团队项目/大型项目:强烈建议加入 GitLensMypy Type Checker,以加强版本控制和代码的健壮性。
  • 需要容器化部署:请安装 Docker 扩展。

您可以直接在 VSCode 的扩展市场中搜索上述的 扩展名称ID 进行安装。希望这份表格能帮助您打造一个高效、舒适的 Python 开发环境!

npm 常用命令一览

功能分类命令说明
安装 (Install)npm installnpm 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.jsonnpm-shrinkwrap.json 精确安装依赖,通常用于持续集成环境,比 npm install 更快、更可靠。
查看 (View)npm listnpm 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 installnpm install <package_name>
    • 团队协作/CI/CD:强烈推荐使用 npm ci 来保证环境的一致性。
    • 维护项目npm outdatednpm update 是保持依赖更新的好帮手。
    • 全局工具:对于像 create-react-appvue-cli 这样的脚手架工具,通常使用 npm install -g 进行全局安装。
  • 下一步实践建议
    1. 动手尝试:创建一个新的空文件夹,执行 npm init -y 初始化一个项目,然后尝试安装(install)、查看(list)、更新(update)和卸载(uninstall)一些你感兴趣的包,比如 lodashdayjs
    2. 理解 dependenciesdevDependencies:尝试使用 --save-dev 安装一些只在开发时需要的工具(如 eslintprettier),并观察 package.json 文件的变化。这有助于理解生产环境和开发环境的差异。
    3. 探索 npxnpx 是一个非常有用的 npm 配套工具,它允许你直接运行 npm 包中的可执行文件,而无需全局安装。例如,可以尝试运行 npx create-react-app my-app,体验一下它的便捷。