为何setuptools生成的wheel未包含顶级非包模块?
解决方案
1. 让单文件模块pytest_pt.py被包含进wheel
当前[tool.setuptools.packages.find]只会识别目录形式的Python包(带__init__.py的普通包或命名空间包),不会自动拾取单文件模块。要解决这个问题,需要在pyproject.toml中显式指定单文件模块路径:
修改pyproject.toml,添加tool.setuptools.py-modules配置:
[build-system] requires = ['setuptools'] build-backend = 'setuptools.build_meta' [tool.setuptools.packages.find] where = ['psrc'] # 显式声明单文件模块 [tool.setuptools.py-modules] pytest_pt = "psrc/pytest_pt.py"
这样setuptools在构建wheel时就会将pytest_pt.py作为顶级模块打包进去,同时不影响sdist的已有行为。
2. 将doc/目录文件包含进wheel
MANIFEST.in仅控制**源码分发包(sdist)**的文件集合,wheel默认不会包含非代码类文件。要把doc/目录的内容打包进wheel,需要使用data_files配置指定安装路径:
在pyproject.toml中添加:
# 将doc目录下所有文件安装到site-packages内的r8format/doc路径 [tool.setuptools.data-files] "r8format/doc" = ["doc/**/*"]
如果需要将文档安装到系统标准文档路径(如Linux的/usr/share/doc/r8format),可以把目标路径改为对应的系统路径,但这种方式可能因平台而异,建议优先安装到包专属路径。
关键原因说明
- 可编辑安装(
pip install -e)时,pip直接将项目根目录加入Python的sys.path,所以能找到psrc/下的所有模块,但wheel构建严格遵循setuptools的包配置规则,未声明的单文件模块会被忽略。 MANIFEST.in的作用范围仅限sdist,wheel的非代码文件必须通过package_data(针对包内文件)或data_files(针对独立目录)单独配置。
内容的提问来源于stack exchange,提问作者cjs
相关产品推荐
相关产品推荐

