使用PyInstaller打包Python脚本为exe后出现SQLAlchemy数据库打开错误求助
绝对路径处理(最常见诱因)
打包后exe的运行工作目录和开发环境不一致,绝对不要用相对路径定位数据库。通过代码获取exe的真实运行目录:import os # 获取当前exe所在目录 base_dir = os.path.dirname(os.path.abspath(__file__)) db_path = os.path.join(base_dir, "your_database.db") # 传入SQLAlchemy创建引擎 engine = create_engine(f'sqlite:///{db_path}')若是用
-F参数打包单文件,PyInstaller会把资源解压到临时目录,需通过sys._MEIPASS获取临时路径:import sys import os def get_base_path(): if getattr(sys, 'frozen', False): return sys._MEIPASS # 打包后的临时资源目录 else: return os.path.dirname(os.path.abspath(__file__)) # 开发环境目录 db_path = os.path.join(get_base_path(), "your_database.db") engine = create_engine(f'sqlite:///{db_path}')打包时必须用
--add-data参数将数据库文件纳入打包范围:
Windows系统:pyinstaller --add-data "your_database.db;." your_script.py
macOS/Linux系统:pyinstaller --add-data "your_database.db:." your_script.py权限排查
不要将exe放在需要管理员权限的目录(如C:\Program Files),换桌面、文档等普通目录运行;同时确保数据库所在目录具备读写权限,exe运行时需要创建/修改数据库文件的权限。路径字符检查
数据库路径及文件名避免包含空格、中文或特殊字符,尽量使用纯英文无空格的命名规则,防止路径解析失败。修正SQLAlchemy连接字符串
Windows系统下的绝对路径需用正斜杠或双反斜杠:
错误写法:sqlite:///C:\folder\db.db
正确写法:sqlite:///C:/folder/db.db或sqlite:///C:\\folder\\db.db
推荐直接用os.path.join生成路径,避免手动拼接出错。单文件打包的持久化处理
单文件打包后,临时目录会在exe关闭后被删除,若需持久化数据,要将数据库指定到用户持久化目录(如文档目录):import os import sys if getattr(sys, 'frozen', False): # 将数据库存到用户文档目录下的专属文件夹 db_dir = os.path.join(os.path.expanduser("~"), "Documents", "YourApp") os.makedirs(db_dir, exist_ok=True) db_path = os.path.join(db_dir, "your_database.db") else: db_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "your_database.db") engine = create_engine(f'sqlite:///{db_path}')
内容的提问来源于stack exchange,提问作者Jason Steagall

