python-3.x - 使用 Pyinstaller 的 SQLite3 和 python 的问题
问题描述
我一直在编写一些代码来创建一个简单的应用程序来使用python 3.7.3
和sqlite3
在 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上查看我的代码
解决方案
当您运行可执行文件时,它会将自身解压缩到_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文档中阅读有关临时路径的更多信息。
推荐阅读
- python - 根据聚类数据使用颜色条更改 Matplotlib 2D 散点图中的标记样式
- angular - 当角度 changeDetector 没有检测到它们时如何显示非常深的嵌套组件?
- java - 丢失了来自 CompletableFuture.allOf 的一些请求
- python - Geopandas - 带有大陆数据的绘图图表
- python - 按逻辑过滤数据帧
- android - 使用叠加动画捕获 android 相机输出
- azure - Azure 数据湖中的访问问题
- angular - 在 Angular 应用程序中使用标准 WebComponents
- python - 在列表中搜索字符索引(python)
- azure - Azure PullAudioInputStream 无法与 Twilio Voice 一起正常工作