wxpython 在 运行 sqlite3 命令时关闭应用程序
wxpython close app when run sqlite3 commands
我正在尝试在 python 3.7 中使用 SQLite3 编写程序。界面是WxPython 4.0.3,然后我用Nuitka 0.6.0编译它。在其他项目中,使用 Nuitka 编译的 WxPython 运行良好。但是此刻我尝试用 SQLite 启动一个数据库程序自动关闭。
看到会发生什么后,我通过右键单击并在程序的根文件中 "open with python" 启动了代码。它也会自动关闭。但是,如果在文件夹中我打开 CMD 并 运行 带有 "python app.py" 的文件,程序运行良好。
这里我保留简化脚本。如果您只是删除带有 self.db = sqlite3.connect("database.db")
的行,然后右键单击打开代码并使用 python 打开,程序将打开并且运行良好。但是当你离开线路与 SQLite 建立连接时,它就会停止工作。我不知道从哪里得到它,当我在 google 中搜索时,我得到的结果与此无关。
代码:
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 的变更日志:
我知道在使用 py2exe 和 PyInstaller 时我已经能够使用 sqlite 和 wxPython。
经过一段时间的研究,我找到了解决办法。
此问题是 python 在右键单击和 "open with python" 时开始的地方。如果您的脚本很简单:
import os
print(os.getcwd())
input("whatever")
如果您通过打开 cmd 并使用 cd 移动到带有 "this_code.py" 的文件夹来打开该脚本。您会看到终端打印出您所在文件夹的目录。但是如果您右键单击并在终端中 "open with python" 打印到 System32 的路径。此外,您还需要输入来冻结等待用户按回车键的终端,因为如果您不包含 "input",终端将在您看到目录之前关闭(或通过 try-except 打印的错误) .
所以当我有 SQLite 的时候。右键打开文件时用python打开。 SQLite 尝试在 System32 文件夹中查找或创建 "database.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)
无论您如何打开它或从何处调用它,它都将始终具有相同的正确行为。
我正在尝试在 python 3.7 中使用 SQLite3 编写程序。界面是WxPython 4.0.3,然后我用Nuitka 0.6.0编译它。在其他项目中,使用 Nuitka 编译的 WxPython 运行良好。但是此刻我尝试用 SQLite 启动一个数据库程序自动关闭。
看到会发生什么后,我通过右键单击并在程序的根文件中 "open with python" 启动了代码。它也会自动关闭。但是,如果在文件夹中我打开 CMD 并 运行 带有 "python app.py" 的文件,程序运行良好。
这里我保留简化脚本。如果您只是删除带有 self.db = sqlite3.connect("database.db")
的行,然后右键单击打开代码并使用 python 打开,程序将打开并且运行良好。但是当你离开线路与 SQLite 建立连接时,它就会停止工作。我不知道从哪里得到它,当我在 google 中搜索时,我得到的结果与此无关。
代码:
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 的变更日志:
我知道在使用 py2exe 和 PyInstaller 时我已经能够使用 sqlite 和 wxPython。
经过一段时间的研究,我找到了解决办法。
此问题是 python 在右键单击和 "open with python" 时开始的地方。如果您的脚本很简单:
import os
print(os.getcwd())
input("whatever")
如果您通过打开 cmd 并使用 cd 移动到带有 "this_code.py" 的文件夹来打开该脚本。您会看到终端打印出您所在文件夹的目录。但是如果您右键单击并在终端中 "open with python" 打印到 System32 的路径。此外,您还需要输入来冻结等待用户按回车键的终端,因为如果您不包含 "input",终端将在您看到目录之前关闭(或通过 try-except 打印的错误) .
所以当我有 SQLite 的时候。右键打开文件时用python打开。 SQLite 尝试在 System32 文件夹中查找或创建 "database.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)
无论您如何打开它或从何处调用它,它都将始终具有相同的正确行为。