关于程序中存在多进程导致使用pyinstaller打包的.exe程序无法正常运行的原因和解决办法

前言

用pandas写了一个关于数据分析的一个脚本,里面需要读取数据库数据,并将最终的结果写入到数据库。为了提升处理数据的效率,我在里面使用了进程池来提升处理速度。内部函数我采用WSGI对函数进行了封装,并提供了一个接口给后端调用此部分方法。在pycharm开启服务,没一点问题。在准备将整个代码打包成exe给测试小姐姐做测试用的时候,出现了意外,使用postman调用接口时,整个程序在一直循环启动,电脑风扇呼呼作响,心凉了一截,出问题了!
在这里插入图片描述

原因

导致此问题的原因是,multiprocessing模块在Windows中使用spawn方法来创建新的进程。而在冻结程序中,没有python解释器,所以multiprocessing模块会调用我们冻结得到的exe,然后这个exe又会调用multiprocessing模块,然后……就会无限循环。使用pyinstaller打包python成为exe文件时候,因为在程序中使用了multiprocessing的Process在程序中创建多进程,导致打包后的exe文件,只要运行到Process创建进程的地方,就重启整个exe文件。
官方的解释在这

解决办法

使用freeze_support()即可 ,先导入freeze_support,在if name == “main”:后调用。
在这里插入图片描述在这里插入图片描述

补充打包带配置文件的命令

pyinstaller --add-data "config/config.yaml;config" -F json_main_21.py -p code_main_21.py

文件目录如下

在这里插入图片描述

补充外部配置文件修改.exe调用参数的代码

针对要实时修改配置参数的情况,希望达到的目的是.exe文件能够动态读取配置文件的参数。

    def load_config(self):
        # 获取可执行文件所在的目录
        if getattr(sys, 'frozen', False):
            # 如果是 PyInstaller 打包后的可执行文件
            main_path = os.path.dirname(sys.executable)
        else:
            # 如果是直接运行的脚本
            main_path = os.path.dirname(os.path.realpath(__file__))
        # 配置文件的路径
        config_path = os.path.join(main_path, "config.yaml")
        # 加载配置文件
        return config_path

补充打包的命令

直接在pycharm左下角的终端,直接输入命令:
pyinstaller -F ***.py -p ***.py 其中-F后面的脚本时是主函数脚本,后面的-p是被调用的脚本。
pyinstaller --onefile --add-data "config/config.yaml;config" -F json_main.py -p code_main.py -p EvaluationAlgorithms.py 在这里插入图片描述
在这里插入图片描述
参考1
参考2
参考3

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值