跳转至

pip install fastapi[standard] 中的 "[standard] " 是什么东西?

我们在python 中安装第三方包的时候经常使用 pip 安装 常见的命令有

pip install requests
pip install httpx

但是你应该也见过下面这样的命令

image.png

这个是fastapi 官方文档首页提示的安装命令,你是否会好奇,这里为什么会有个 [standard]? 它和直接安装 pip install fastapi 有什么区别?

类似的还有

pip insall mcp[cli]
pip install crewai_tool[mcp]

使用 uv 也可以这样

uv add mcp[cli]
uv add crewai_tool[mcp]

接下来让我们一起看一下这个中括号是什么东西。

python 可选依赖项

在 Python 的 pip 安装命令中,类似 fastapi[standard] 的语法表示安装 主包(fastapi)的同时,额外安装其 可选依赖项standard)。这是通过 Python 包的 extras_require 功能实现的。

这个也就是安装 fastapi 定义的依赖,如果你不需要那些依赖,则可以不安装,只安装了fastapi,正常的开发时没有问题的,但是如果你想用 fastapi run 命令启动服务,那么不好意思,你需要安装可选依赖 standard

一般而言,我们大多数情况下是只是使用pip 或者 uv 来安装第三方包,当然我们也可以开发并发布我们自己的包。

接下来一起看一下如何开发带有可选依赖的包。

在 uv 中配置可选依赖

目前很多流行的库已经切换到 uv 来管理项目了,这里先看一下如何在uv 中使用可选依赖。

[project]
name = "your_package"
version = "0.1"
dependencies = [
    "numpy>=1.0",  # 核心依赖
]


[project.optional-dependencies]
mcp = ["pandas", "scikit-learn"]  # 可选依赖组
extra_feature = ["requests"]      # 另一个可选组

在 pyproject.toml 文件的 dependencies 字段,配置项目的核心依赖。

project.optional-dependencies 字段配置可选依赖。

让我们看一下python mcp官方的pyproject.toml

[project]
name = "mcp"
dynamic = ["version"]
description = "Model Context Protocol SDK"
readme = "README.md"
requires-python = ">=3.10"
...
dependencies = [
    "anyio>=4.5",
    "httpx>=0.27",
    "httpx-sse>=0.4",
    "pydantic>=2.7.2,<3.0.0",
    "starlette>=0.27",
    "python-multipart>=0.0.9",
    "sse-starlette>=1.6.1",
    "pydantic-settings>=2.5.2",
    "uvicorn>=0.23.1; sys_platform != 'emscripten'",
]

[project.optional-dependencies]
rich = ["rich>=13.9.4"]
cli = ["typer>=0.12.4", "python-dotenv>=1.0.0"]
ws = ["websockets>=15.0.1"]
...

如果我们使用 uv add mcp[cli] 安装mcp时,会额外安装 typer 和 python-dotenv 包。

传统的 setup.py 方式

传统的第三方库需要在 setup.py 中进行配置, 通过 extras_require 参数传递一个字典。

from setuptools import setup

setup(
    name="your_package",
    version="0.1",
    install_requires=[
        # 核心依赖
        "numpy>=1.0",
    ],
    extras_require={
        # 可选依赖组
        "mcp": ["pandas", "scikit-learn"],  # 安装时通过 [mcp] 触发
        "extra_feature": ["requests"],      # 另一个可选组
    },
)

总结

本篇内容不多,介绍了什么是python 的可选依赖以及如何开发一个带有可选依赖的第三方库。