
通过 PEP 496 环境标记(如 sys_platform == 'win32'),可在 pyproject.toml 中声明条件依赖,使 pip install . 自动按操作系统加载对应包(如仅 Windows 安装 pywinpty),无需手动指定 [windows] 可选依赖。
通过 pep 496 环境标记(如 `sys_platform == 'win32'`),可在 `pyproject.toml` 中声明条件依赖,使 `pip install .` 自动按操作系统加载对应包(如仅 windows 安装 `pywinpty`),无需手动指定 `[windows]` 可选依赖。
在现代 Python 项目中,跨平台兼容性是常见需求。例如,你的项目在 Windows 上需依赖 pywinpty(用于伪终端交互),而在 Linux/macOS 上则使用内置 pty 模块——此时不应强制所有用户安装 Windows 专用包,也不应依赖用户记忆并手动执行 pip install .[windows]。
正确做法是使用环境标记(Environment Markers)将依赖声明为条件化。它基于 PEP 496 和 PEP 508 标准,被 pip、uv、poetry 等主流工具原生支持,并可直接写入 pyproject.toml 的 project.dependencies 字段:
[project]
name = "myapp"
version = "0.1.0"
dependencies = [
"requests>=2.28.0",
"pywinpty>=2.0.14; sys_platform == 'win32'",
"ptyprocess>=0.7.0; sys_platform != 'win32'",
]✅ 效果:
- 在 Windows 上执行
pip install .或uv pip install .时,pywinpty自动安装,ptyprocess被跳过; - 在 Linux/macOS 上则反之,且整个过程静默、可靠、符合 PEP 规范。
⚠️ 注意事项:
- 不要混用
optional-dependencies和环境标记来解决同一问题——[project.optional-dependencies]适用于功能模块划分(如test、dev),而环境标记专用于平台/Python 版本/实现等运行时上下文判断; - 常用环境标记包括:
sys_platform == 'win32'、platform_system == 'Linux'、python_version >= '3.9'、implementation_name == 'cpython';完整列表见 PEP 496; -
uv完全兼容该语法,且因 Rust 实现更高效,推荐在 CI/CD 或多平台构建中优先使用uv pip install .; - 若项目仍需保留
.[windows]作为显式入口(如文档或调试场景),可同时定义,但生产安装应以条件依赖为主。
总结:用 dependencies + 环境标记替代 optional-dependencies 实现平台自适应,是更简洁、健壮、标准化的实践。它让单条 pip install . 命令真正“开箱即用”,大幅提升开发者体验与部署可靠性。

















