Pyinstaller ---不编译我的GUI脚本

时间:2019-04-17 22:40:03

标签: python-3.x pyqt5 pyinstaller

在最近几天尝试使用pyinstaller和cx_freeze尝试使我的应用程序作为.exe运行。

在python中一切正常。

我的文件夹中有以下项目可供编译...

files for compile

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:驱动器。

3 个答案:

答案 0 :(得分:1)

我相信答案很简单。让我们分析一下堆栈跟踪

enter image description here

红色部分是错误名称:OperationalError。来自docs

针对与数据库操作相关且不一定在程序员控制下的错误引发的异常。意外断开连接,找不到数据源名称,无法处理事务,等等。它是DatabaseError的子类。

但是,绿色部分告诉我们:

没有这样的桌子:不锈钢

这只是意味着找不到表,因为该表已删除或根本没有创建。

据我所知,找不到表创建代码。这不是PyInstaller错误。

答案 1 :(得分:0)

您的exe关闭,然后打开,因为您没有正文代码。在您的主要代码正文中添加以下内容:

input()

那应该解决它。

答案 2 :(得分:0)

许多小时后,我注意到该脚本在尝试访问数据库表时失败了,而不是在我的编译器中的connect语句上失败了。

进一步检查后,我注意到在编译运行后,codes.db丢失了,直到我单击.exe才能运行。然后,codes.db从exe弹出了,只有0kb,没有表格。

我得出的结论是,我需要研究如何在编译中包括原始.db文件,并且不允许它在不存在的情况下创建新的空.db。

我已经通过用原始的.db覆盖空的.db进行了测试,突然我的.exe正常运行了。