首页 > 解决方案 > 使用 Pyinstaller 的 SQLite3 和 python 的问题

问题描述

我一直在编写一些代码来创建一个简单的应用程序来使用python 3.7.3sqlite3在 debian 上注册产品。当我终于完成时,我尝试使用 pyinstaller 从我的脚本创建一个可执行文件。一切都很好,直到我使用 dist 文件夹中的“./file”命令运行可执行文件并且出现 3 个错误。在我的 sqlite 数据库中,我只使用了一个名为“product”的表,但终端显示:

sqlite3.OperationalError: no such table: product

此外,它还向我显示了其他消息:

Traceback (most recent call last):
File "index.py", line 141, in <module>
File "index.py", line 47, in __init__
File "index.py", line 61, in get_products
File "index.py", line 52, in run_query"

在终端上,我使用此命令运行 pyinstaller :

pyinstaller --add-data "database.db:." index.py --onefile

为什么我的数据库无法识别为一个文件运行?您可以在https://github.com/BraymNoodles/AppPythonProducts.git上查看我的代码

标签: python-3.xsqlitetkinterpyinstaller

解决方案


当您运行可执行文件时,它会将自身解压缩到_MEIxxxxx临时路径(环境变量 TEMP)内的路径(其中 xxxxx 是随机数)。该文件database.db位于该目录中。

因此,如果您的代码打开数据库文件,如下所示:

conn = sqlite3.connect('database.db')

它将database.db在当前目录中查找,但它不存在。因此database.db将创建一个新的,这会导致您的问题中提到的错误:

sqlite3.OperationalError:没有这样的表:产品

因为database.db是空的。

您需要使用以下代码获取临时路径:

import os
import sys
...
appdir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__)))

并打开数据库,如下所示:

conn = sqlite3.connect(os.path.join(appdir, 'database.db'))

您可以在 PyInstaller文档中阅读有关临时路径的更多信息。


推荐阅读