python打包后出现bug(已解决)

 首先我的程序在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(),尝试从冻结的程序中创建新进程可能会导致程序无法正确运行或直接崩溃。

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值