如何正确配置setup.py中package_data解决文件找不到报错
问题场景
Python项目打包完成后运行时抛出No such file or directory类报错,提示找不到对应文件或目录,项目目录结构如下:
原有setup.py配置代码如下:
from setuptools import setup setup( name='raw-microsoft-wwi', version='1.0.0', package_dir={"":"src"}, packages=[ "raw_microsoft_wwi", "raw_microsoft_wwi.configuration", "raw_microsoft_wwi.reader", "raw_microsoft_wwi.writer", "raw_microsoft_wwi.transformer" ], package_data = {"src/raw_microsoft_wwi/queries": ["*.sql"]}, include_package_data = True, install_requires=[ "delta-spark==1.2.0", "pyspark==3.2.1", "python-environ==0.4.54" ], zip_safe=False )
问题根因
报错核心原因是setup.py中package_data配置路径写法错误,导致queries目录下的.sql文件未被打包进安装产物,运行时无法读取对应文件。
配置错误点:
- 已通过
package_dir={"":"src"}指定src为包根目录,此时package_data的键需要填写Python包名,而非磁盘上的物理路径src/raw_microsoft_wwi/queries queries是raw_microsoft_wwi包下的资源目录,并未注册为独立Python包,原配置的路径规则setuptools无法识别include_package_data=True需要配合项目根目录的MANIFEST.in文件才能生效,仅靠package_data控制打包资源时开启该参数,容易出现资源识别冲突
修复步骤
1. 修正setup.py配置
将package_data的键改为对应包名,路径改为相对于包目录的资源路径,修正后代码如下:
from setuptools import setup setup( name='raw-microsoft-wwi', version='1.0.0', package_dir={"":"src"}, packages=[ "raw_microsoft_wwi", "raw_microsoft_wwi.configuration", "raw_microsoft_wwi.reader", "raw_microsoft_wwi.writer", "raw_microsoft_wwi.transformer" ], # 键为包名,值为相对于该包目录的资源文件匹配规则 package_data = {"raw_microsoft_wwi": ["queries/*.sql"]}, # 仅用package_data控制资源时可注释该参数避免冲突 # include_package_data = True, install_requires=[ "delta-spark==1.2.0", "pyspark==3.2.1", "python-environ==0.4.54" ], zip_safe=False )
2. (可选)保留include_package_data=True的配置方法
如果需要开启该参数,在和setup.py同级的项目根目录新建MANIFEST.in文件,写入以下规则明确要打包的资源:
graft src/raw_microsoft_wwi/queries global-include *.sql
3. 修正代码中的资源读取逻辑
不要在代码中写硬编码相对路径(比如open("./queries/xxx.sql")),安装后文件路径会随安装位置变化,硬编码路径必然报错。使用Python标准库读取包内资源:
# Python 3.9+ 直接使用内置importlib.resources from importlib.resources import files # 替换为实际的SQL文件名 sql_content = files("raw_microsoft_wwi.queries").joinpath("你的sql文件名.sql").read_text() # 兼容Python3.9以下版本可安装backport版本:pip install importlib_resources # from importlib_resources import files
4. 验证打包结果
重新构建安装包后,执行以下命令检查SQL文件是否被正确打包:
# 构建wheel安装包 python setup.py bdist_wheel # 查看wheel包内文件列表,替换为你实际生成的whl文件名 unzip -l dist/raw_microsoft_wwi-1.0.0-py3-none-any.whl | grep sql
如果输出中能看到queries目录下所有.sql文件,说明资源打包正确,重新安装后即可解决文件找不到的报错。
内容的提问来源于stack exchange,提问作者user12253044
相关产品推荐
相关产品推荐

