You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据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中排除它:

  1. 新建your-package-train-data项目,结构如下:
your-package-train-data/
├── your_package_train_data/
│   └── train_data/
│       ├── data1.csv
│       └── data2.npy
└── setup.py
  1. 主包的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模板,打包时通过环境变量选择:

  1. 准备两个文件:

    • Manifest.full:包含训练数据,比如include your_package/train_data/*
    • Manifest.minimal:不包含训练数据,只保留核心代码文件
  2. 修改主包的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",
    # 依赖配置同上...
)
  1. 打包不同版本:
    • 全量版本: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:53:03