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

PyInstaller使用.spec文件打包时无法找到db.sqlite文件的问题

问题:PyInstaller打包时无法找到指定的db.sqlite文件,即使文件实际存在

我正在使用PyInstaller打包Python项目,需要将db.sqlite文件纳入最终可执行文件。使用.spec文件打包时,始终收到找不到该文件的错误,尽管文件确实在指定目录中。

我的.spec文件代码如下:

# -*- mode: python ; coding: utf-8 -*- 

a = Analysis(
    ['gui.py'],
    pathex=['D:\\Programming\\Projects\\Library_Management'],
    binaries=[],
    datas=[(r'D:\Programming\Projects\Library_Management\assets\db.sqlite', 'assets')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)

pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='gui',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

运行pyinstaller gui.spec时出现错误:

Unable to find 'D:\\Programming\\Projects\\Library_Management\\assets\\db.sqlite' when adding binary and data files.

我已验证文件在指定路径,也尝试调整路径并重打包,但仍报错。请问问题原因及解决方法是什么?


解决方法

可能的原因及对应方案

1. 路径格式或转义问题

Windows系统下的路径反斜杠容易出现转义异常,即便使用了原始字符串(r前缀),也可以尝试以下两种方式修正:

  • 改用正斜杠替代反斜杠:
    datas=[('D:/Programming/Projects/Library_Management/assets/db.sqlite', 'assets')],
    
  • 使用相对路径(前提是你在项目根目录下执行打包命令):
    datas=[('./assets/db.sqlite', 'assets')],
    

2. 工作目录不匹配

如果执行pyinstaller命令时的工作目录不是项目根目录(D:\Programming\Projects\Library_Management),可能导致路径解析错误。先切换到项目根目录再打包:

cd D:\Programming\Projects\Library_Management
pyinstaller gui.spec

3. 文件实际存在性与权限验证

  • 仔细检查文件名拼写:确认文件名是db.sqlite,没有大小写错误(Windows不区分大小写,但PyInstaller的路径解析可能严格匹配),也没有后缀名错误(比如误写为.sqlite3)。
  • 检查文件权限:确保当前用户有读取该文件的权限,且文件未被其他程序占用(比如数据库工具正在打开它)。

4. 打包后运行时的文件访问逻辑

即使打包成功,运行可执行文件时也需要正确获取文件路径。PyInstaller会将datas中的文件解压到临时目录,代码中需通过以下方式获取路径:

import os
import sys

def get_db_file_path():
    # 判断是否为打包后的环境
    if getattr(sys, 'frozen', False):
        base_dir = sys._MEIPASS
    else:
        # 开发环境下的项目根目录
        base_dir = os.path.dirname(os.path.abspath(__file__))
    return os.path.join(base_dir, 'assets', 'db.sqlite')

内容的提问来源于stack exchange,提问作者Ragul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:22:20