wxpython 在运行 sqlite3 命令时关闭应用程序



我正在尝试在python 3.7中使用SQLite3制作一个程序。该接口是WxPython 4.0.3,然后我用Nuitka 0.6.0编译它。在其他项目中,用Nuitka编译的WxPython运行良好。但是目前我尝试使用 SQLite 启动数据库,程序会自动关闭。

在看到可能发生的事情后,我通过右键单击并在程序的根文件中"使用 python 打开"来启动代码。它也会自动关闭。但是,如果在文件夹中我打开CMD并使用" python app.py"运行该文件,则程序运行良好。

在这里,我留下简化的脚本。如果您只是删除带有self.db = sqlite3.connect("database.db")的行,然后右键单击打开代码并使用python打开,则程序将打开并运行良好。但是当你离开线路与SQLite建立连接时,它就会停止工作。我不明白从哪里得到它,当我在谷歌中搜索时,我得到的结果与此无关。

代码:

import wx
import sqlite3
class MyFrame(wx.Frame):
def __init__(self):
super(MyFrame, self).__init__(None, id=wx.ID_ANY, title="PDF database",
pos=wx.DefaultPosition, size=wx.Size(500, 300),
style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)
self.db = sqlite3.connect("database.db")
if __name__ == "__main__":
app = wx.App()
main_window = MyFrame()
main_window.Show()
app.MainLoop()

'

我可能在这里缺少一些东西,但看起来如果您使用 Nuitka 进行独立安装,它会排除可能导致问题的 sqlite。请参阅此处"优化"标题下的Nuitka更新日志:

  • http://nuitka.net/doc/Changelog.pdf

我知道在使用py2exe和PyInstaller时,我已经能够使用sqlite和wxPython。

经过一段时间的研究,我找到了解决方案。

这样做的问题是当右键单击并"使用 python 打开"时,python 开始的地方。如果你有一个脚本,简单地:

import os
print(os.getcwd())
input("whatever")

如果通过打开cmd并使用CD移动到带有"this_code.py"的文件夹来打开该脚本。您将看到终端会打印您所在文件夹的目录。但是,如果您右键单击并在终端中"使用 python 打开",则会打印到 System32 的路径。此外,您还需要输入来冻结终端,等待用户按 Enter 键,因为如果您不包含"input",则终端在您看到目录之前就关闭了(或跨 try-except 打印的错误(。

所以当我有SQLite时。右键单击打开文件并使用python打开时。SQLite尝试在System32文件夹中查找或创建"数据库.db"。并且存在权限问题。为了解决这个问题,并且可以以任何方式或在哪里打开文件。只需添加:

import os
script_dir = os.path.dirname(os.path.abspath(__file__))

script_dir将是文件的位置,而不是它被称为 Python 的位置。因此,当您打开与SQLite的连接时。使用sqlite3.connect(f'file:{script_dir}/database.db', uri=True)

无论您如何打开它或从何处调用它,这将始终具有相同的正确行为。

最新更新