?在windows環(huán)境下,使用python3 + pyinstaller V3.4打包多進(jìn)程工程時(shí)菇爪,啟動exe后,執(zhí)行到多進(jìn)程開始處柒昏,軟件又啟動一個(gè)進(jìn)程凳宙,完全是重新初始化整個(gè)流程,而不是僅僅啟動另一個(gè)進(jìn)程執(zhí)行target指定的方法昙楚,但是在python終端執(zhí)行源碼近速,則無此現(xiàn)象诈嘿,百度后堪旧,發(fā)現(xiàn)通過如下操作可解決此問題削葱。
1. 增加一個(gè)myMutilprocess.py文件,內(nèi)容如下:
import os
import sys
import multiprocessing
# 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
2. 主程序main.py中import myMultiprocess.py啟動入口第一行添加一行代碼
if __name__ == "__main__":
multiprocessing.freeze_support()
??????? 下面開始原來的邏輯
再次打包后淳梦,啟動exe沒有出現(xiàn)啟動多個(gè)程序的現(xiàn)象析砸。