首先我的程序在pycharm里面可以正常运行,打包后出现了小bug,不知道如何排查问题在哪。
https://pan.baidu.com/s/1Ue2nJpZbSyjaXY0U4XQHdg?pwd=gic0
代码放在上方链接
需要的库
pip3 install torch torchvision torchaudio
pip install ultralytics
pip install PyQt5
pip install PyQt5-tools
pip install pyinstaller
pip install auto-py-to-exe
任务:点击开始按钮,检测我想要的图片并显示,终端会返回信息。
打包后的问题:假设刚开始为1号界面,点击开始按钮会打开一个和1号一样的2号界面,并且不会检测图片,点击二号界面的开始,会打开三号界面,此时点击1号界面的开始无反应。但是当我关闭三号界面的时候二号界面就可以正常运行了,再次点击开始也可以运行我想要的内容。关闭二号界面之后一号界面就可以正常运行了。
在A电脑打包后在A电脑正常运行,在其他电脑会出现这个问题。在B电脑打包后在所有电脑都会出现这个问题,A和B电脑的编辑器环境不一样(下载的库不一样多)。
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QApplication, QWidget
from zhuzijiemian import Ui_QT5
import sys
from ultralytics import YOLO
model1 = YOLO('yolov8n.pt') # 模型初始化
class Predict_quantity(QThread):
def run(self):
results1 = model1('bus.jpg') # 使用传入的路径运行检测并返回结果
class MyWindow(QWidget, Ui_QT5):
def __init__(self):
super().__init__()
self.setupUi(self)
#初始化界面
self.showMaximized() #最大化显示
# 绑定信号与槽
self.pushButton_start.clicked.connect(self.start) # start
self.run_thread1 = Predict_quantity()
def start(self):
if not self.run_thread1.isRunning():#运行检测线程
self.run_thread1.start()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
上图为点击1号界面开始按钮之后的结果
上图为点击二号界面开始按钮结果图
上图为关闭二号界面,1号界面自动运行的结果
上图为多次点击1号界面开始按钮,多次完成所需任务的结果图
由于pyinstaller打包多进程不友好且yolov8会自动使用多进程加速,所以导致了此bug,在代码中添加 如下内容就可以正常运行。
multiprocessing.freeze_support()
当你使用 multiprocessing
模块在 Windows 上开发多进程程序时,如果你计划将你的程序"冻结"成独立的可执行文件,你需要在主程序入口点调用 multiprocessing.freeze_support()
。这是因为在 Windows 上,multiprocessing
依赖于 spawn 来创建新进程,而在冻结的可执行文件中,启动新进程的方式与在 Python 脚本中直接运行时不同。如果不调用 multiprocessing.freeze_support()
,尝试从冻结的程序中创建新进程可能会导致程序无法正确运行或直接崩溃。