生成的Python whl文件缺失预期文件,求助原因及解决办法
你遇到的问题是使用setup.py bdist_wheel生成的whl文件只包含少量Python文件,缺少项目中其他被使用的模块,核心原因和解决方法如下:
核心原因
子目录未被识别为Python包:Python的包结构要求每个子目录都必须包含
__init__.py文件(可以是空文件),否则find_packages()函数不会将该目录及其下的文件识别为包的一部分,也就不会打包进whl文件。从你的打包输出看,dataconversion.managers.all_manager这个模块未被包含,大概率是dataconversion/managers/目录下没有__init__.py。Entry Points路径错误:你的
entry_points配置中使用了all_manager.AllManager.process_all,这是不完整的模块路径,即使打包成功,安装后运行该入口点也会找不到模块。
解决步骤
1. 补全子目录的__init__.py文件
检查你的项目目录结构,确保dataconversion/managers/目录下存在__init__.py文件(空文件即可)。正确的目录结构应该是:
DataMigration/ ├── setup.py └── dataconversion/ ├── __init__.py ├── main_all.py └── managers/ ├── __init__.py └── all_manager.py
2. 修正setup.py中的Entry Points路径
将entry_points中的模块路径修改为完整的包路径,修改后的setup.py代码如下:
import setuptools from setuptools import find_packages import dataconversion.managers.all_manager setuptools.setup( name='dataconversion', version='1.0', author='icsBO', author_email='redacted', description='redacted', packages=find_packages(), classifiers=[ 'Programming Language :: Python :: 3', 'Operating System :: OS Independent', ], entry_points={ 'ConvertAll': 'run_all=dataconversion.managers.all_manager.AllManager.process_all' } )
3. 清理缓存并重新打包
先清理之前的构建缓存,避免旧文件干扰,再重新生成wheel包:
# 清理构建缓存 python setup.py clean --all # 重新生成wheel文件 python setup.py bdist_wheel
可选:添加MANIFEST.in强制包含文件
如果确认补全__init__.py后仍有文件未被打包,可以在项目根目录(与setup.py同级)创建MANIFEST.in文件,内容如下:
include dataconversion/**/*.py
该文件会强制setuptools包含dataconversion目录下所有层级的Python文件。
验证结果
生成新的whl文件后,你可以将其解压,检查是否包含了dataconversion/managers/all_manager.py等之前缺失的文件,确认打包完整后再进行安装测试。
内容的提问来源于stack exchange,提问作者icsbo

