You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:21:50