Por qué el ejecutable de Python abre una nueva instancia de ventana cuando se llama a la función mediante un módulo de multiprocesamiento en Windows

Pregunta corta: ¿Por qué el ejecutable de Python generado por pyinstaller abre una nueva instancia de ventana cuando se llama a la función mediante un módulo de multiprocesamiento en el sistema operativo Windows?

Tengo un código GUI escrito usando pyside. Cuando, al hacer clic en el botón simple, se calculará factorial en otro proceso (utilizando el módulo de multiprocesamiento). Funciona como se esperaba cuando ejecuto el progtwig python. Pero después de crear el ejecutable con PyInstaller y cuando ejecuto con exe, se está creando una nueva ventana cuando se llama la función mediante el multiprocesamiento del módulo. Aquí está el código y el proceso paso a paso para reproducir el problema.

Código:

import sys import multiprocessing from PySide import QtGui from PySide import QtCore def factorial(): f = 4 r = 1 for i in reversed(range(1, f+1)): r *= i print 'factorial', r class MainGui(QtGui.QWidget): def __init__(self): super(MainGui, self).__init__() self.initGui() def initGui(self): b = QtGui.QPushButton('click', self) b.move(30, 30) b.clicked.connect(self.onClick) self.resize(600, 400) self.show() def onClick(self): print 'button clicked' self.forkProcess() def forkProcess(self): p = multiprocessing.Process(target=factorial) p.daemon = True p.start() if __name__ == "__main__": print 'ok' app = QtGui.QApplication(sys.argv) ex = MainGui() sys.exit(app.exec_()) 
  1. Ejecute el código anterior utilizando el indicador de comandos de Windows o Power Shell

    pyinstaller.exe gui.py

  2. Abra el archivo dist / gui / gui.exe (dist \ gui \ gui.exe). Tendrás una ventana abierta

introduzca la descripción de la imagen aquí

Cuando hacemos clic en el botón, hace clic en su factorial de cálculo, pero creamos una nueva instancia de ventana. Es raro. No sucede cuando ejecuto el progtwig antes de crear el ejecutable o en linux. Solo sucede cuando ejecuto el archivo ejecutable de Python generado

La captura de pantalla después de hacer clic en el botón de clic

introduzca la descripción de la imagen aquí

Si desea utilizar el multiprocesamiento como un ejecutable congelado, debe llamar a multiprocessing.freeze_support() al comienzo de su script principal. Esto permitirá que el multiprocesamiento “se haga cargo” cuando genera sus procesos de trabajo.

Consulte también https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing