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

emz*_*mzx 3 python database sqlite pyinstaller

我正在尝试使用 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)
Run Code Online (Sandbox Code Playgroud)

我用它来包含 Sqlite 文件并且它 100% 工作并且在 .spec 文件中我输入以下内容:

a.datas.append(('sqlite.db', 'sqlite.db', 'DATA'))
Run Code Online (Sandbox Code Playgroud)

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

我可以使用 Sqlite 数据库执行此操作吗?如果不能,有任何数据库可以帮助我吗?

Aks*_*hay 5

如果您使用--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)
Run Code Online (Sandbox Code Playgroud)

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

a.datas.append(('sqlite.db', 'sqlite.db', 'DATA'))
Run Code Online (Sandbox Code Playgroud)

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

print  base_path
Run Code Online (Sandbox Code Playgroud)

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

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

您无需将数据库文件包含在捆绑的 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)
Run Code Online (Sandbox Code Playgroud)

这将在 AppData\Roaming 目录中创建一个以您的应用程序名称命名的文件夹,并且您的数据库文件将存储在此处。