使用python setup.py bdist_wheel构建Python包时,默认包含哪些文件?哪些需通过package_data定义?
关于
python setup.py bdist_wheel打包的文件包含规则 好问题!我来帮你理清楚用python setup.py bdist_wheel创建Python包时,默认会包含哪些文件,以及哪些需要通过package_data关键字来指定——这个细节确实容易让人混淆。
默认会包含的文件
- Python源码文件(
.py):只要它们位于setup.py中packages参数指定的包目录下,或是通过py_modules参数声明的独立模块文件,都会被默认打包。 - 包目录下的
__init__.py:这是Python识别“包”的核心标志,所有被声明的包目录里的这个文件都会被自动包含。 - 元数据与配置文件:
setup.py、setup.cfg、pyproject.toml(如果项目使用了的话)这类构建配置文件会被默认包含。 - 常见命名的许可证文件:比如
LICENSE、LICENSE.txt、LICENSE.md这类符合常规命名的许可证文件,确实会被默认打包进wheel里,你注意到的这点没错。 - 若项目存在
MANIFEST.in文件:里面指定的文件也会被参考纳入打包范围(不过bdist_wheel对MANIFEST.in的处理会优先满足包的结构规范,不是完全照搬)。
需要通过package_data定义的文件
这些都是非Python源码类的运行时资源文件,因为bdist_wheel默认只会关注可执行的Python代码,不会自动识别这些资源:
- 配置类文件:比如包内的
.json、.yaml、.ini配置文件。 - 静态资源:图片(
.png、.jpg)、字体文件、音频片段这类静态资源。 - 数据文件:
.csv、.txt格式的数据集,或是供程序读取的文本资源。 - 模板文件:
.html、.jinja2这类用于渲染的模板文件。 - 非源码类二进制文件:比如一些辅助功能的
.so、.pyd文件(如果不是通过ext_modules编译生成的)。
举个简单的例子,假设你的包名为mytool,包内有resources/config.yaml和icons/logo.png两个资源文件,你需要在setup.py里这样配置:
from setuptools import setup, find_packages setup( name="mytool", packages=find_packages(), package_data={ "mytool": ["resources/*.yaml", "icons/*.png"] }, # 其他参数... )
另外要注意:如果资源文件不在包目录内部,而是在项目根目录的独立文件夹(比如assets/),那应该使用data_files参数来声明,而不是package_data——后者专门用于包内部的资源文件。
内容的提问来源于stack exchange,提问作者finswimmer
相关产品推荐
相关产品推荐

