如何在setup.py中检测pip安装时指定的可选依赖组名称
在setup.py中检测pip安装时指定的可选依赖组
当执行pip install my_package[<extra>]时,要在setup.py中捕获并校验用户传入的可选依赖组名称(比如test1),可通过重写setuptools的安装命令实现,以下是具体方案:
实现步骤
- 自定义
install命令类,通过setuptools的Distribution对象获取用户请求的可选依赖组,同时添加校验逻辑。 - 在
setup()中指定使用自定义命令类。
完整setup.py示例代码
import sys from setuptools import setup, find_packages from setuptools.command.install import install class CustomInstall(install): def run(self): # 获取用户请求的可选依赖组列表 requested_extras = self.distribution.extras for extra in requested_extras: print(f"Detected extra dependency group: {extra}") # 校验可选组是否在允许范围内 allowed_extras = ['test1', 'test2', 'test3'] if extra not in allowed_extras: raise ValueError(f"Invalid extra '{extra}'. Allowed extras are: {', '.join(allowed_extras)}") # 执行默认的安装流程 super().run() setup( name="my_package", version="0.1.0", packages=find_packages(), # 与pyproject.toml中的可选依赖组保持一致 extras_require={ "test1": [], "test2": [], "test3": [] }, cmdclass={ "install": CustomInstall, } )
验证效果
- 执行
pip install my_package["test1"]时,setup.py会输出:Detected extra dependency group: test1 - 若传入非法可选组(如
pip install my_package["invalid"]),会抛出错误并终止安装:ValueError: Invalid extra 'invalid'. Allowed extras are: test1, test2, test3
注意事项
- 确保
setup.py中extras_require的配置与pyproject.toml里的可选依赖组完全一致,避免校验逻辑出错。 - 该方案依赖setuptools内部API,主流版本(>=60.0)均可正常使用,若后续版本变更可能需微调。
内容的提问来源于stack exchange,提问作者Firas Khemakhem
相关产品推荐
相关产品推荐

