已设置include_package_data=True,MANIFEST.in指定文件仍被忽略求助
问题原因
include_package_data=True的作用是包含Python包目录内的非代码文件(通过MANIFEST.in或版本控制系统自动检测的文件)。你的config目录位于项目根目录,不属于任何Python包(项目里只有superapp是合法Python包),所以setuptools不会将其识别为包数据,自然不会被打包进sdist和wheel。
解决方案
方案1:将config目录移入Python包内(推荐)
调整项目结构,把config放到superapp目录下:
. ├── MANIFEST.in ├── pyproject.toml ├── setup.cfg ├── setup.py └── superapp ├── __init__.py ├── main.py └── config └── conf.yaml
修改MANIFEST.in内容:
graft superapp/config
此时include_package_data=True会正常生效,sdist和wheel都会包含这个包内的config目录。代码里读取配置时,建议用importlib.resources模块来获取文件路径,避免硬编码带来的问题。
方案2:使用data_files保留根目录config(适合全局配置场景)
如果不想移动目录,在setup.cfg的[options]块中添加data_files配置,指定文件的安装路径:
[options] zip_safe = False include_package_data=True packages = find: install_requires = loguru pyyaml data_files = (etc/superapp, config/conf.yaml)
这种方式会把conf.yaml安装到目标环境的etc/superapp目录下(虚拟环境对应路径为venv/etc/superapp)。注意代码运行时需要动态获取这个路径,比如通过环境变量或预设的安装路径来读取配置文件。
补充:只在sdist中包含根目录config
如果仅需要sdist包包含config目录,你的现有MANIFEST.in已经生效——执行python setup.py sdist后,解压生成的tar.gz文件里能看到config目录。但wheel格式默认只包含Python包相关文件,所以要让wheel也包含,必须采用上面两种方案之一。
内容的提问来源于stack exchange,提问作者brillenheini
相关产品推荐
相关产品推荐

