python应用中使用了multiprocessing多进程,使用pyinstaller打包出来的程序可能产生多个窗口

问题现象

我用pyside(类似pyqt)开发了一个应用程序。直接使用pycharm运行,一切都正常。但当我使用pyinstaller将它打包之后,再去运运行,发现窗口总是产生多个。

问题分析

直接运行没有问题,那么问题肯定和pyinstaller相关。在网上搜索之后发现是由多进程引起的(multiprocessing模块)。

在他的wiki中有说明:

使用该multiprocessing模块时,必须调用

multiprocessing.freeze_support()

紧接在if name == 'main':主模块行之后。

这在Python官方文档中也有说明:
multiprocessing.freeze_support()

添加对使用multiprocessing已冻结的程序生成 Windows 可执行文件的支持。(已使用py2exe、 PyInstaller和cx_Freeze进行测试。)

需要在主模块行之后直接调用此函数。例如:if __name__ == '__main__'

py 复制代码
from multiprocessing import Process, freeze_support

def f():
    print('hello world!')

if __name__ == '__main__':
    freeze_support()
    Process(target=f).start()

如果freeze_support()省略该行,则尝试运行冻结的可执行文件将引发RuntimeError。

在 Windows 以外的任何操作系统上调用时,调用freeze_support()都无效。另外,如果该模块在Windows上由Python解释器正常运行(程序没有被冻结),则freeze_support()没有任何影响。

相关推荐
Larry_Yanan1 天前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
醒过来摸鱼1 天前
Java classloader
java·开发语言·python
superman超哥1 天前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
小鸡吃米…1 天前
Python - 继承
开发语言·python
JIngJaneIL1 天前
基于java+ vue农产投入线上管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
祁思妙想1 天前
Python中的FastAPI框架的设计特点和性能优势
开发语言·python·fastapi
唐装鼠1 天前
rust自动调用Deref(deepseek)
开发语言·算法·rust
Dingdangcat861 天前
反恐精英角色识别与定位-基于改进的boxinst_r101_fpn_ms-90k_coco模型实现
python
Lucas555555551 天前
现代C++四十不惑:AI时代系统软件的基石与新征程
开发语言·c++·人工智能
源代码•宸1 天前
goframe框架签到系统项目(BITFIELD 命令详解、Redis Key 设计、goframe 框架教程、安装MySQL)
开发语言·数据库·经验分享·redis·后端·mysql·golang