Procesos atascados en bucle con PyInstaller-ejecutable

Python v3.5, Windows 10

Estoy usando múltiples procesos y tratando de capturar la entrada del usuario. Buscando en todo lo que veo, hay cosas extrañas que suceden cuando se usa input() con múltiples procesos. Después de 8 horas + de bashs, nada de lo que implementé funcionó, estoy seguro de que lo estoy haciendo mal, pero no puedo por mi vida resolverlo.

El siguiente es un progtwig muy simplificado que demuestra el problema. Ahora funciona bien cuando ejecuto este progtwig en PyCharm, pero cuando uso pyinstaller para crear un único ejecutable, falla. El progtwig está constantemente atascado en un bucle pidiéndole al usuario que ingrese algo como se muestra a continuación: introduzca la descripción de la imagen aquí .

Estoy bastante seguro de que tiene que ver con la forma en que Windows recibe la entrada estándar de las cosas que he leído. También he intentado pasar las variables de entrada del usuario como elementos Queue() a las funciones, pero el mismo problema. Leí que deberías poner input() en el proceso principal de python, así que lo hice debajo de if __name__ = '__main__':

 from multiprocessing import Process import time def func_1(duration_1): while duration_1 >= 0: time.sleep(1) print('Duration_1: %d %s' % (duration_1, 's')) duration_1 -= 1 def func_2(duration_2): while duration_2 >= 0: time.sleep(1) print('Duration_2: %d %s' % (duration_2, 's')) duration_2 -= 1 if __name__ == '__main__': # func_1 user input while True: duration_1 = input('Enter a positive integer.') if duration_1.isdigit(): duration_1 = int(duration_1) break else: print('**Only positive integers accepted**') continue # func_2 user input while True: duration_2 = input('Enter a positive integer.') if duration_2.isdigit(): duration_2 = int(duration_2) break else: print('**Only positive integers accepted**') continue p1 = Process(target=func_1, args=(duration_1,)) p2 = Process(target=func_2, args=(duration_2,)) p1.start() p2.start() p1.join() p2.join() 

Debe usar multiprocessing.freeze_support() cuando genere un ejecutable de Windows con PyInstaller.

Directamente de la documentación :

multiprocessing.freeze_support ()

Agregue soporte para cuando un progtwig que usa multiprocesamiento se haya congelado para producir un ejecutable de Windows. (Ha sido probado con py2exe, PyInstaller y cx_Freeze).

Es necesario llamar a esta función inmediatamente después de la línea if name == ‘ main ‘ del módulo principal. Por ejemplo:

 from multiprocessing import Process, freeze_support def f(): print('hello world!') if __name__ == '__main__': freeze_support() Process(target=f).start() 

Si se omite la línea freeze_support (), intentar ejecutar el ejecutable congelado generará RuntimeError.

Llamar a freeze_support () no tiene efecto cuando se invoca en ningún sistema operativo que no sea Windows. Además, si el intérprete de Python ejecuta el módulo normalmente en Windows (el progtwig no se ha congelado), freeze_support () no tiene ningún efecto.

En su ejemplo, también tiene una duplicación de código innecesaria que debe abordar.