#----------------------------------------------------------------------------- # Copyright (c) 2013, PyInstaller Development Team. # # Distributed under the terms of the GNU General Public License with exception # for distributing bootloader. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- # Bootloader unsets _MEIPASS2 for child processes to allow running # PyInstaller binaries inside pyinstaller binaries. # This is ok for mac or unix with fork() system call. # But on Windows we need to overcome missing fork() fuction. # # See http://www.pyinstaller.org/wiki/Recipe/Multiprocessing import multiprocessing.forking import os import sys class _Popen(multiprocessing.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. # Last character is stripped in C-loader. We have to add # '/' or '\\' at the end. os.putenv('_MEIPASS2', sys._MEIPASS + 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('_MEIPASS2') else: os.putenv('_MEIPASS2', '') class Process(multiprocessing.Process): _Popen = _Popen class SendeventProcess(Process): def __init__(self, resultQueue): self.resultQueue = resultQueue multiprocessing.Process.__init__(self) self.start() def run(self): print('SendeventProcess') self.resultQueue.put((1, 2)) print('SendeventProcess') if __name__ == '__main__': # On Windows calling this function is necessary. if sys.platform.startswith('win'): multiprocessing.freeze_support() print('main') resultQueue = multiprocessing.Queue() SendeventProcess(resultQueue) print('main')