import sys, os
import platform
import multiprocessing
try:
import multiprocessing.forking as forking
except ImportError:
if platform.system() == "Windows":
import multiprocessing.popen_spawn_win32 as forking
else:
import multiprocessing.popen_fork as forking
_env_frozen = 'frozen'
_env_frozen_path = '_MEIPASS'
_env_mp_frozen_path = _env_frozen_path + '2'
[docs]def isFrozen():
return getattr(sys, _env_frozen, False)
[docs]def frozenPath():
return getattr(sys, _env_frozen_path, None)
[docs]def freezeSupport():
if platform.system() == "Windows" and isFrozen():
multiprocessing.freeze_support()
class _Popen(forking.Popen):
def __init__(self, *args, **kw):
if isFrozen():
# We have to set original _MEIPASS2 value from sys._MEIPASS
# to get --onefile mode working.
# Last character is stripped in C-loader. We have to add
# '/' or '\\' at the end.
os.putenv(_env_mp_frozen_path, frozenPath() + os.sep)
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(_env_mp_frozen_path)
else:
os.putenv(_env_mp_frozen_path, '')
[docs]class Process(multiprocessing.Process):
_Popen = _Popen
Queue = multiprocessing.Queue