在最近几天尝试使用pyinstaller和cx_freeze尝试使我的应用程序作为.exe运行。
在python中一切正常。
我的文件夹中有以下项目可供编译...
rawCodes.py是我的主力军。
mcnc.py是我的PyQt5 GUI。
mcnclogo_rc.py包含我在GUI中使用的所有图像。
以下是我的主要进口商品中的清单...
import sqlite3
from mcnc import Ui_MainWindow
import mcnclogo_rc
from PyQt5 import QtCore,QtGui,QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem,
QDialog, QComboBox
import sys
import math
似乎当我运行pyinstaller时,它完成了该过程并按预期生成了3个文件夹。
该exe文件显然位于dist文件夹中,并且似乎都正常运行。
但是我运行exe时,它只是打开,然后再次关闭,什么也没出现。
我确信我的mcnc.py文件未包含在内,因此没有看到GUI(pyqt5)。
有人知道如何在我的SPEC文件中特别列出mcnc.py,以确保它包含在其中……与mcnclogo_rc相同。
编辑
我已经从CMD运行.exe,并且正在获得以下回溯...
G:\Yans work in progress\Yans python\Qt\to
compile\dist\rawCodes>rawCodes.exe
Traceback (most recent call last):
File "rawCodes.py", line 3287, in <module>
File "rawCodes.py", line 22, in __init__
File "rawCodes.py", line 3101, in Load_StainlessDb
sqlite3.OperationalError: no such table: stainless
[13020] Failed to execute script rawCodes
可能是我的数据库没有正确打包到dist / build中吗?
编辑2
我已经更改了sqlite3路径,因此它是动态的,但是仍然给出完全相同的错误...
import sqlite3
import mcnc
from mcnc import Ui_MainWindow
import mcnclogo_rc
from PyQt5 import QtCore,QtGui,QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem,
QDialog, QComboBox
import sys
import math
import os
package_dir = os.path.abspath(os.path.dirname(__file__))
db_dir = os.path.join(package_dir, 'codes.db')
print(db_dir)
conn = sqlite3.connect(db_dir)
c = conn.cursor()
c.execute('')
def stainless_list(self):
stainless_getlist = []
content = 'SELECT grade FROM stainless ORDER BY prefix ASC'
res = conn.execute(content)
for row in res:
stainless_getlist.append(row[0])
conn.close
stainless_getlist.insert(0, "Select...")
self.comboBox_2.clear()
self.comboBox_2.addItems(stainless_getlist)
#print(stainless_getlist)
return
然后我仍然出现以下错误...
G:\Yans work in progress\Yans python\Qt\to
compile\dist\rawCodes>rawCodes.exe
Traceback (most recent call last):
File "rawCodes.py", line 3287, in <module>
File "rawCodes.py", line 22, in __init__
File "rawCodes.py", line 3101, in Load_StainlessDb
sqlite3.OperationalError: no such table: stainless
[14664] Failed to execute script rawCodes
编辑3
这是编译后我的目录路径的打印...
G:\Yans work in progress\Yans python\Qt\to
compile\dist\rawCodes>rawCodes.exe
G:\Yans work in progress\Yans python\Qt\to compile\dist\rawCodes
G:\Yans work in progress\Yans python\Qt\to compile\dist\rawCodes\codes.db
这是我的代码并导入...
import sqlite3
import mcnc
from mcnc import Ui_MainWindow
import mcnclogo_rc
from PyQt5 import QtCore,QtGui,QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem,
QDialog, QComboBox
import sys
import math
import os
import os.path as op
try:
this_file = __file__
except NameError:
this_file = sys.argv[0]
this_file = op.abspath(this_file)
if getattr(sys, 'frozen', False):
application_path = getattr(sys, '_MEIPASS',
op.dirname(sys.executable))
else:
application_path = op.dirname(this_file)
sqlite_conn = os.path.join(application_path, 'codes.db')
print(application_path)
print(sqlite_conn)
conn = sqlite3.connect(sqlite_conn)
c = conn.cursor()
c.execute('')
但是一旦编译并尝试从dist运行,它将不再能看到数据库中的表。
编辑4
我将代码更改为以下内容...
import sqlite3
import mcnc
from mcnc import Ui_MainWindow
import mcnclogo_rc
from PyQt5 import QtCore,QtGui,QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem,
QDialog, QComboBox
import sys
import math
import os
import os.path as op
try:
this_file = __file__
except NameError:
this_file = sys.argv[0]
this_file = op.abspath(this_file)
if getattr(sys, 'frozen', False):
application_path = getattr(sys, '_MEIPASS', op.dirname(sys.executable))
else:
application_path = op.dirname(this_file)
sqlite_conn = os.path.join(QApplication.applicationDirPath(), 'codes.db')
print(application_path)
print(sqlite_conn)
conn = sqlite3.connect(sqlite_conn)
c = conn.cursor()
c.execute('')
我现在得到以下追溯...
G:\Yans work in progress\Yans python\Qt\to
compile\dist\rawCodes>rawCodes.exe
QCoreApplication::applicationDirPath: Please instantiate the QApplication
object first
G:\Yans work in progress\Yans python\Qt\to compile\dist\rawCodes
codes.db
Traceback (most recent call last):
File "rawCodes.py", line 3303, in <module>
File "rawCodes.py", line 38, in __init__
File "rawCodes.py", line 3117, in Load_StainlessDb
sqlite3.OperationalError: no such table: stainless
[3268] Failed to execute script rawCodes
编辑5
app = QApplication(sys.argv)
sqlite_conn = os.path.join(QApplication.applicationDirPath(), 'codes.db')
G:\Yans work in progress\Yans python\Qt
C:/Program Files (x86)/Python37-32\codes.db
出现一个直接错误,根本无法连接到数据库。 db文件夹现在指向C:驱动器。
答案 0 :(得分:1)
我相信答案很简单。让我们分析一下堆栈跟踪
红色部分是错误名称:OperationalError。来自docs:
针对与数据库操作相关且不一定在程序员控制下的错误引发的异常。意外断开连接,找不到数据源名称,无法处理事务,等等。它是DatabaseError的子类。
但是,绿色部分告诉我们:
没有这样的桌子:不锈钢
这只是意味着找不到表,因为该表已删除或根本没有创建。
据我所知,找不到表创建代码。这不是PyInstaller错误。
答案 1 :(得分:0)
您的exe
关闭,然后打开,因为您没有正文代码。在您的主要代码正文中添加以下内容:
input()
那应该解决它。
答案 2 :(得分:0)
许多小时后,我注意到该脚本在尝试访问数据库表时失败了,而不是在我的编译器中的connect语句上失败了。
进一步检查后,我注意到在编译运行后,codes.db丢失了,直到我单击.exe才能运行。然后,codes.db从exe弹出了,只有0kb,没有表格。
我得出的结论是,我需要研究如何在编译中包括原始.db文件,并且不允许它在不存在的情况下创建新的空.db。
我已经通过用原始的.db覆盖空的.db进行了测试,突然我的.exe正常运行了。