背景:用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