如何在setup.py中用package_data包含无__init__.py的非Python文件?
解决Python包打包时配置文件未被包含的问题
问题分析
你的目录结构中,logging.yml是foo包下config子目录的文件,但当前setup.py的package_data配置有误,导致文件未被打包进安装包,也未出现在SOURCES.txt中。同时,跨版本(Python2.7到3.12)和跨平台兼容需要更可靠的配置方式。
修正方案
1. 调整setup.py的package_data配置
package_data的键需要对应Python包名,这里config是foo包的子目录,而非独立包,因此键应设为foo,值为相对于foo包的文件路径:
from os import path from setuptools import find_packages, setup package_name = "foo" if __name__ == "__main__": setup( name=package_name, packages=find_packages(), # 配置foo包下的config子目录中的logging.yml package_data={ package_name: ["config/logging.yml"] }, include_package_data=True, )
2. 添加MANIFEST.in文件(关键兼容项)
为了兼容旧版本setuptools和Python2.7,在项目根目录(与setup.py同目录)创建MANIFEST.in文件,明确指定要包含的文件:
include foo/config/logging.yml
这个文件会告诉setuptools在生成源码分发包时包含指定文件,确保跨版本、跨平台的兼容性。
验证方法
- 执行
python setup.py sdist生成源码包,解压dist/foo-*.tar.gz后检查是否包含foo/config/logging.yml - 查看
foo.egg-info/SOURCES.txt,确认文件已被列入其中 - 重新执行安装命令
python -m pip install .,之后在虚拟环境中查找文件:fd -HIFuuueyml logging应该能找到对应的路径
内容的提问来源于stack exchange,提问作者Samuel Marks
相关产品推荐
相关产品推荐

