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()没有任何影响。

相关推荐
清风与日月4 分钟前
c#事件委托示例
开发语言·c#
后端小张9 分钟前
【JAVA 进阶】穿越之我在修仙世界学习 @Async 注解(深度解析)
java·开发语言·spring boot·后端·spring·注解·原理
Yeats_Liao14 分钟前
Go Web 编程快速入门 18 - 附录B:查询与扫描
开发语言·前端·后端·golang
国服第二切图仔19 分钟前
Rust实战开发之图形界面开发入门(egui crate)
开发语言·后端·rust
程序员爱钓鱼19 分钟前
Python编程实战:文件读写(文本/二进制)详解与实战
后端·python·ipython
Zhangzy@19 分钟前
Rust 依赖管理与版本控制
开发语言·后端·rust
百锦再23 分钟前
第6章 结构体与方法
android·java·c++·python·rust·go
Momentary_SixthSense23 分钟前
rust表格文件处理
开发语言·rust
小八四爱吃甜食26 分钟前
【R语言】构建GO、KEGG相关不同物种的R包
开发语言·golang·r语言
音符犹如代码26 分钟前
ArrayList常见面试题二
java·开发语言·面试·职场和发展