zoukankan      html  css  js  c++  java
  • Pyinstaller打包多进程程序出错解决办法

    作者:yooongchun
    微信:18217235290


    最近在使用Pyinstaller打包Python程序的时候发现,打包过程正常,但在运行时会出错,表现为进程不断增加至占满电脑CPU死机,程序版本及环境为:

    修改方式比较简单,在 if __name__=='__main__:'下添加一句multiprocessing.freeze_support() 即可。
    如下:

    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 *
    

    值得提醒一点的是,上述程序打包时提示的错误非常难以定位到多进程处的问题,而是会提示一些别的包或者依赖文件找不到等等。

    另外有关Pyinstaller打包常出现的问题可以在我的部分文章中找到一些解决方案:
    Pyinstaller基本用法:https://blog.csdn.net/zyc121561/article/details/79563662
    Pyinstaller隐式导入出错解决:https://blog.csdn.net/zyc121561/article/details/79562935

  • 相关阅读:
    Spring笔记系列--1--基本内容与xml配置
    aop(面向切面编程)在Java中的两种动态代理实现
    linux配置网络,关闭防火墙命令操作
    Nginx知识记录
    发邮件工具类
    增强请求响应——代理模式
    取url中的参数值
    lumisoft会将eml后缀格式的附件给解析成文本,这里保存成文件
    lumisoft邮件头不规范造成内容无法读取
    lumisoft邮件内容中文乱码问题
  • 原文地址:https://www.cnblogs.com/yczha/p/13160205.html
Copyright © 2011-2022 走看看