【问题标题】:How do I make pyinstaller include my database?如何让 pyinstaller 包含我的数据库?
【发布时间】:2016-05-27 12:23:57
【问题描述】:

我有一个使用 sqlite3 的 PyQt4 应用程序。我目前有两个单独的文件:一个 .py 文件和一个 .db 文件。最初我使用 .py 文件并尝试创建一个可执行文件,只是使用这种想法可能会以某种方式链接,但是当我运行 .exe 时,它​​会在它到达与数据库相关的代码时中断。如何让 pyinstaller 也包含数据库?

【问题讨论】:

    标签: python sqlite pyqt4 pyinstaller


    【解决方案1】:

    This post 帮助了我。基本上,您可以使用以下参数运行 pyinstaller 命令(假设您的脚本是 script.py 并且您的数据库是 database.db):

    pyinstaller -w --add-data "database.db;." script.py
    

    这将首先创建一个.spec 文件,将database.db 列为要包含在您的构建中的文件。创建的.spec 文件随后将用于运行构建。

    正如here 解释的那样,当您运行将要创建的.exe 文件时,-w 选项可防止显示控制台。

    ---- 或者 ----

    根据the docs,您可以先只创建.spec 文件,然后对其进行修改以列出应包含的数据文件。 script.py.spec 文件是使用以下命令创建的:

    pyi-makespec script.py
    

    然后,在创建的.spec 文件中,您可以修改datas 字段:

    a = Analysis(...
        datas=[ ('database.db', '.') ],
        ...
    )
    

    这假定database.db 位于根文件夹中。如果没有,您将需要包含路径。 '.' 指定您希望数据库文件在构建中的位置(在这种情况下,'.' 是根文件夹)。要包含更多文件,您可以将更多元组 ('<file>', '<path>') 添加到 datas 列表中。

    【讨论】:

    • 你好@Joel Oduro-Afriyie,我创建了一个 Python exe 文件,它是用 Microsoft SQL 数据库构建的。该应用程序运行良好并连接到我用来冻结它的系统上的数据库,但是当部署到其他系统时,它没有连接到数据库。我被告知该应用程序可以在其他系统上正常工作,我需要确保这些系统也具有 Microsoft SQL。现在我正在考虑使用 SQLite 数据库并开始创建表。我确实希望我的应用程序能够在其他系统上正常打开,并且可以毫无问题地访问数据库?
    • 嗨@CEO,我相信这应该可行。 SQLite 是 Python 的内部数据库,因此在您的应用程序中包含一个 sqlite 数据库应该可以使其运行,而不必依赖主机系统上的外部数据库。
    • 你好@Joel Oduro,我最近还注意到,使用 onefile 命令冻结文件会使数据库在另一个系统上部署和运行时无法访问。除非我在 pyinstalling 时不使用 --onefile 命令,否则它只会在源系统中正常工作。这意味着在 build 和 dist 文件夹中,另一个包含 .exe 文件和其他发行版的文件夹,我需要将所有内容打包到接收系统
    • 您好@Joel Oduro,请问我可以在使用Microsoft sql server 数据库时应用您上面提供的代码吗?如果是,我如何在我的系统中找到数据库?我尝试使用搜索栏找到它,但无济于事。我用 Python 和 MSSQL 构建了一个应用程序,它们在我用于创建 .exe 文件的系统上运行良好,但是当部署到其他系统时,数据库变得无法访问。我想在新帖子上问这个问题,但我受到这里的管理员和版主的限制。
    • 有没有办法进行设置,以便用于特定操作系统(win/linux/mac)的不同可执行文件可以使用相同的数据库?
    【解决方案2】:

    您需要使用规范文件。看看documentation

    pyinstaller 会自动创建这些文件。你只需要编辑它。查看文档中的示例。要添加 README 文件,您只需将元组(源、目标)添加到“数据”:

    a = Analysis(...
     datas=[ ('src/README.txt', '.') ],
     ...
     )
    

    【讨论】:

    • 我正在将我的 .db 文件添加到数据列表并保存它,但由于某种原因它仍然无法正常工作。我将在问题中添加我正在做的事情。
    • 哦,我真的让它工作了,但控制台现在打开了。你知道我通过了哪个阶段--windowed?
    • 由于某种原因它不再工作了。你知道我在 --windowed 和 --onefile 选项中传递了哪个命令吗? pyi-makespec 或 pyinstaller myfile.spec?
    • 我不明白为什么,但有时当我构建它时它会引用数据库,而其他时候它不会。
    • afaik 它应该是pyinstaller --onefile --windowed your_app.py
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2019-05-04
    • 2020-11-09
    相关资源
    最近更新 更多