PyQt5 使用 Pyinstaller+multiprocessing 打包多进程应用时,引发的一些问题

news/2024/10/22 23:24:22

解决 Pyinstaller 打包 PyQt5+multiprocessing 多进程应用时,引发的一些问题,包括反复启动主进程,以及:AttributeError: 'NoneType' object has no attribute 'write'

本文提供一些解决方案,您可能需要根据自己的实际情况,逐个尝试,直到自己的multiprocessing多进程应用正常运行

一、解决反复启动 GUI 主进程的问题

这个问题的产生原因,只知道是与Windows系统有关,因为Python官方在multiprocessing库中指明,这个方法只影响windows系统,且主要针对生成可执行文件,也就是Windows 下的 exe程序
官方原文:multiprocessing.freeze_support()

问题复现

1. 准备示例程序

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_multiprocessing.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 
"""
import sys
from multiprocessing import Process
import time
from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidgetdef background_task():while True:print("后台进程正在运行...")time.sleep(3)  # 模拟一些后台工作class MainWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('PyQt5 与 Multiprocessing')layout = QVBoxLayout()self.start_button = QPushButton('启动后台进程')self.start_button.clicked.connect(self.start_process)layout.addWidget(self.start_button)self.setLayout(layout)def start_process(self):self.process = Process(target=background_task)self.process.start()print("后台进程已启动。")def closeEvent(self, event):self.process.terminate()self.process.join()event.accept()if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

运行后,可以得到下面这样的窗口
image

2. 使用下面的两种方式打包

# 方式1,无 -w
pyinstaller -D -y .\test_process.py# 方式2,有 -w
pyinstaller -D -w -y .\test_process.py

无论那种方式,启动后,若点击“启动后台进程”均无法成功,且主进程会反复启动
image

解决办法

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_multiprocessing.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 
"""from multiprocessing import freeze_support... # 忽略,无变化if __name__ == '__main__':freeze_support()  # 使用冻结app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

无论那种打包方式,启动后,均正常运行
image

二、解决AttributeError: 'NoneType' object has no attribute 'write'

这个问题,您不一定有,因为这和你的应用程序有关,上文我们已经通过添加freeze_support()来解决主程序 GUI 反复重启的问题,但是某些时候,当你用pyinstaller -D -w -y .\test_process.py这种无控制台窗口模式(也就是黑窗口)时,就会出现这个问题:
如下图:
image

推测产生的原因

推测产生的原因是因为,使用-w无控制台窗口模式时,标准输出被重定向了,导致相关函数无法得到正确初始化,于是反应出来就是NoneType

解决办法

方法1:尝试使用--noconsole 代替 --windowed(-w)

此参数是完全禁用控制台窗口,而不是重定向

方法2:手动重定向输出

```python
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Author      : yqbao
@ Version     : V1.0.0
@ Description :
"""... # 忽略,您自己的应用程序if __name__ == "__main__":sys.stdout = open('output.txt', 'w')  # 手动重定向sys.stderr = open('error.txt', 'w')  # 手动重定向freeze_support()app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

本文章的原文地址
GitHub主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72207.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

2024数据采集与融合实践作业一

码云链接:gitee码云 作业①: 1)、爬取学校排名实验: o 要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。 o 输出信息:排名 学校名称 省市 学校类型 总分1 清华大学 北京 综合 852.5…

spring上 -基于注解配置bean,动态代理,AOP笔记

用的是jdk8,spring框架里jar包的下载可以自己搜到 注解用到的jar包。60,注解配置Bean快速入门 基本介绍 代码结构: UserDao.javapackage com.hspedu.spring.component;import org.springframework.stereotype.Repository;/* * 使用 @Repository 标识该类是一个Repository…

2024数据采集与融合技术实践第二次作业

这个作业属于哪个课程 <首页 - 2024数据采集与融合技术实践 - 福州大学 - 班级博客 - 博客园 (cnblogs.com)>这个作业要求在哪里 <作业2 - 作业 - 2024数据采集与融合技术实践 - 班级博客 - 博客园 (cnblogs.com)>学号 <102202126>一、作业内容 作业①要求:…

Proxmox VE 安装Mikrotik RouterOS

一、环境介绍 1、PVE版本:Proxmox Virtual Environment 7.2-3 2、ROS CHR镜像文件,Google Chrome 浏览器上访问Mikrotik官网下载,或访问云盘。 3、WinSCP、Xshell 用于上传镜像文件到PVE物理机。(请自行百度下载)Xshell下载地址WinSCP下载地址 二、PVE部署准备工作,上传R…

Educational Codeforces Round 170 (Rated for Div. 2) ABCD

Educational Codeforces Round 170 (Rated for Div. 2) ABCD来源:Educational Codeforces Round 170 (Rated for Div. 2) A. Two Screens 题意 给两个屏幕,两种操作,每种操作一秒,求让两个屏幕显示两个指定字符串的最短时间 操作:在一个屏幕的字符串后加任意一个字符 把一…

一个案例入门补环境

补环境其实是`补浏览器有而Node没有的环境,即补BOM和DOM的对象`,一切环境补的结果都是向浏览器实际结果靠齐,入门补环境只需要记住缺啥补啥这个技巧,当运行提示缺少某个环境,则直接在浏览器运行该环境是啥结果然后补上该结果。此分享只用于学习用途,不作商业用途,若有冒…

tcp

TCP/IP 协议与七层 ISO 模型的对应关系TCP/IP 和 ISO 的区别: OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。