gpt4 book ai didi

python - Pyinstaller 无法将信息插入到 sqlite 数据库文件 --onefile

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:09 26 4
gpt4 key购买 nike

我正在尝试使用 Pyinstaller 构建单文件 EXE 文件,它包含 Sqlite 数据库文件,它不能与 --onefile 一起使用,但在正常情况下意味着(许多文件)它工作 100%。

我正在做的是在 .py 脚本中:

import os, sys
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)

我用它来包含 Sqlite 文件,它工作 100%在 .spec 文件中,我输入了这个:

a.datas.append(('sqlite.db', 'sqlite.db', 'DATA'))

当我构建尽可能多的文件时,它 100% 工作,我可以从我的应用程序插入信息,但作为 --onefile 我不能

我可以用 Sqlite 数据库做这个吗?如果我不能,有没有数据库可以帮助我?

最佳答案

如果您正在使用 --onefile 选项(即将所有内容捆绑到一个可执行文件中),当您运行 your_app_name.exe 时,Pyinstaller 会将您的数据解压缩到一个临时文件中文件夹,路径设置为 sys._MEIPASS。

def path_to_temp(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")

return os.path.join(base_path, relative_path)

因此,当您启动应用程序时,您在规范文件中指定的数据文件也将被提取到这个临时位置。

a.datas.append(('sqlite.db', 'sqlite.db', 'DATA'))

您可以通过访问临时位置来检查提取的文件。您只需将其添加到上述代码中即可获得其路径

print  base_path

现在在这里您还会看到您的数据库文件。现在对其进行一些更改。然后退出您的应用程序并再次启动它。获取新的临时位置并检查您所做的更改是否已反射(reflect)回来。答案是。因为它不是重新打包提取的文件。

因此数据文件可以是图像或声音文件之类的文件,甚至是不会被程序修改的数据库文件。

您无需将数据库文件包含在捆绑的 exe 中。而是在 Appdata 中以您的应用程序名称在运行时创建一个文件夹,并将您的数据库文件存储在那里。

使用 sqlite3 的应用示例。

dir_path = os.path.join(os.environ['APPDATA'], 'YOUR_APP_NAME')
if not os.path.exists(dir_path):
os.makedirs(dir_path)
file_path = os.path.join(dir_path, 'your_database_file.sqlite')
sqlite3.connect(file_path)

这将在 AppData\Roaming 目录中创建一个以您的应用名称命名的文件夹,您的数据库文件将存储在那里。

关于python - Pyinstaller 无法将信息插入到 sqlite 数据库文件 --onefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33838909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com