Pyinstaller打包python多进程程序出错 出现多个窗口

背景:用pyinstaller将python项目打包成exe文件后,运行exe时,程序出现多个窗口,关闭以后又出现新的窗口,感觉陷入了死循环。

问题:经过网上的漫长搜索查阅发现是因为程序使用了多进程模式,而在windows上pyinstaller打包多进程程序需要添加特殊指令。
这里是官方github给出的解释:
https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing

解决方案:在你的主程序前添加一行代码:

if __name__=='__main__':
	# 在此处添加
	multiprocessing.freeze_support()
	# 这里是你的代码
	# ......

如:
在这里插入图片描述
如果你的Pyinstaller版本低于3.3版本的话,还需要额外添加一个模块:

import os
import sys
# Module multiprocessing is organized differently in Python 3.4+
try:
    # Python 3.4+
    if sys.platform.startswith('win'):
        import multiprocessing.popen_spawn_win32 as forking
    else:
        import multiprocessing.popen_fork as forking
except ImportError:
    import multiprocessing.forking as forking

if sys.platform.startswith('win'):
    # First define a modified version of Popen.
    class _Popen(forking.Popen):
        def __init__(self, *args, **kw):
            if hasattr(sys, 'frozen'):
                # We have to set original _MEIPASS2 value from sys._MEIPASS
                # to get --onefile mode working.
                os.putenv('_MEIPASS2', sys._MEIPASS)
            try:
                super(_Popen, self).__init__(*args, **kw)
            finally:
                if hasattr(sys, 'frozen'):
                    # On some platforms (e.g. AIX) 'os.unsetenv()' is not
                    # available. In those cases we cannot delete the variable
                    # but only set it to the empty string. The bootloader
                    # can handle this case.
                    if hasattr(os, 'unsetenv'):
                        os.unsetenv('_MEIPASS2')
                    else:
                        os.putenv('_MEIPASS2', '')

    # Second override 'Popen' class with our modified version.
    forking.Popen = _Popen

把上述内容保存为multiprocess.py ,然后在你的程序中引入该模块即可:

from multiprocess import *

值得提醒一点的是,上述程序打包时提示的错误非常难以定位到多进程处的问题,而是会提示一些别的包或者依赖文件找不到等等。
类似于下面问题,让我以为是自己程序出了问题。。。
在这里插入图片描述
参考:https://blog.csdn.net/zyc121561/article/details/82941056

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值