如何根据extra_requires修改Manifest.in实现Python包差异化安装?
嘿,这个需求挺有意思的——默认安装带全量数据和依赖,指定extra反而更精简。我来给你拆解下可行的方案:
一、依赖管理:实现默认多依赖,train_only少依赖
pip 20.3及以上版本支持依赖排除功能,刚好能满足你的需求:把全量依赖放在默认的install_requires里,然后在train_only extra中移除不需要的依赖。这样用户安装默认版本时拿到所有依赖,安装[train_only]时自动剔除冗余项。
示例setup.py配置:
from setuptools import setup setup( name="your-package", version="0.1.0", # 默认安装的全量依赖 install_requires=[ "numpy>=1.21", "pandas>=1.3", "scikit-learn>=1.0", # train_only不需要的依赖 "matplotlib>=3.4" # 同理 ], extras_require={ "train_only": [ "-scikit-learn", "-matplotlib" ] }, # 其他必要配置(比如packages、author等) )
测试一下:
- 默认安装:
pip install your-package→ 安装所有4个依赖 - 精简安装:
pip install your-package[train_only]→ 只安装numpy和pandas
二、数据管理:实现默认含训练数据,train_only不含
这里要注意:Manifest.in是打包阶段的配置,一旦生成包(sdist/wheel),里面的文件就固定了,没法在安装时动态调整。所以你最初想用不同Manifest.in的思路,需要配合打包时的环境变量来实现,或者换更优雅的拆包方案:
方案1:把训练数据拆成独立附属包(推荐)
把训练数据单独打包成一个轻量包(比如your-package-train-data),然后在主包的默认依赖中包含它,在train_only extra中排除它:
- 新建
your-package-train-data项目,结构如下:
your-package-train-data/ ├── your_package_train_data/ │ └── train_data/ │ ├── data1.csv │ └── data2.npy └── setup.py
- 主包的
setup.py更新依赖配置:
install_requires=[ "numpy>=1.21", "pandas>=1.3", "scikit-learn>=1.0", "matplotlib>=3.4", "your-package-train-data>=0.1.0" # 默认包含训练数据 ], extras_require={ "train_only": [ "-scikit-learn", "-matplotlib", "-your-package-train-data" # 排除训练数据包 ] }
这样用户默认安装会自动拉取训练数据,train_only安装则完全不包含这部分内容,非常规范。
方案2:用环境变量切换打包用的Manifest文件
如果你不想拆包,可以准备两个Manifest模板,打包时通过环境变量选择:
准备两个文件:
Manifest.full:包含训练数据,比如include your_package/train_data/*Manifest.minimal:不包含训练数据,只保留核心代码文件
修改主包的
setup.py,动态生成Manifest.in:
import os from setuptools import setup # 读取环境变量,默认用全量Manifest manifest_template = os.environ.get("PACKAGE_MANIFEST", "Manifest.full") with open(manifest_template, "r") as f: manifest_content = f.read() # 临时生成Manifest.in供打包使用 with open("Manifest.in", "w") as f: f.write(manifest_content) setup( name="your-package", version="0.1.0", # 依赖配置同上... )
- 打包不同版本:
- 全量版本:
python setup.py sdist bdist_wheel(默认用Manifest.full) - 精简版本:
PACKAGE_MANIFEST=Manifest.minimal python setup.py sdist bdist_wheel
- 全量版本:
之后你可以把两个包上传到PyPI,或者内部仓库,用户根据需求安装对应的包即可。
注意事项
- 依赖排除功能需要pip 20.3+,记得在项目文档里说明最低pip版本要求
- 如果用拆包方案,训练数据包的版本要和主包保持同步,避免兼容性问题
内容的提问来源于stack exchange,提问作者Sam Bobel
相关产品推荐
相关产品推荐

