前言
用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
1230

被折叠的 条评论
为什么被折叠?



