pyInstaller carga el script varias veces

He logrado que el progtwig de instalación de Pyinstaller se ejecute más o menos correctamente ahora, excepto que abre demasiadas ventanas. Es un proyecto de pygame, y sigue cargando todo de nuevo una vez cada segundo. Mi PC se llena de ventanas de juego después de unos segundos y todo se detiene.

Al ejecutarlo desde la línea de comandos, puedo ver copias impresas que dicen que la aplicación se está pegando una y otra vez en la ventana de la línea de comandos. Por lo que sé, las aplicaciones no se cierran o salen, solo generan más y más.

El comando que llamo para iniciar pyinstaller es este:

pyinstaller --onedir main_local.py 

El archivo principal se ve así:

 # Library imports import pygame # Project imports from multiroidal_client import MultiroidalClient from settings import * import time # Main program function def main(): # Initialise game class game = MultiroidalClient(SCREEN_SIZE, ('127.0.0.1', 8080)) # Start game loop game.main_game_loop() # Execute main function if __name__ == '__main__': main() 

Intenté comentar el bit if __ name __ … para ver si, por algún motivo, estaba ejecutando la función principal y llamando a un duplicado cada vez por accidente o algo. Cuando se comenta, el ejecutivo no hace nada, como es de esperar.

¿Algunas ideas? No he incluido ningún código más porque hay un montón, y no estoy seguro de qué partes son relevantes. Déjame saber si necesitas ver algo más.

Aclamaciones

EDITAR: Agregué una impresión rápida después de game.main_game_loop () solo para comprobar si el script saltó del bucle infinito del juego. No hay tal suerte. Está cargando una instancia paralela de los scripts, todos ejecutándose simultáneamente.

EDITAR: Miré a través de los documentos de pyinstaller y logré eliminar un poco más de depuración. No estoy seguro de si es relevante o no, pero aquí está. Esta pantalla de diálogo sigue reimprimiéndose una y otra vez. También probé la opción –noupx, que a veces puede ayudar aparentemente, sin tanta suerte.

introduzca la descripción de la imagen aquí

Multiprocesamiento!

Probé algunos progtwigs de Python más simples, y empaquetaron todo muy bien. Entonces no fue un problema con mi método, fue el código. Pensándolo de nuevo, debe ser algo inusual o difícil de empaquetar el código en el proyecto. Hmmm, tal vez enhebrar?

Tengo un par de subprocesos que se ejecutan en paralelo, y son subprocesos multiprocesamiento. Después de googlear encontré esta solución mágica .

Simplemente coloque esta línea, multiprocessing.freeze_support() , justo después de if __name__ == "__main__" y antes de llamar a la función main() .

 if __name__ == '__main__': # Pyinstaller fix multiprocessing.freeze_support() main() 

Parece que los tipos que desarrollaron el módulo de multiprocesamiento tuvieron que incluir un truco para permitir el congelamiento del empaque (py2exe, pyinstaller, etc.). Parece raro que no se incluya un poco más suavemente. Si deja esa llamada freeze_support() , aún funciona aunque no esté ejecutando desde un código empaquetado en lugar de archivos estándar de Python.

De todos modos, si está congelando / apaciguando el código y parece ejecutarse una y otra vez, verifique si está usando multiprocesamiento. Un simple google “multiprocesamiento de pyinstaller” dio la respuesta.

Para su información, esto solo funciona en el modo ” --onedir “, el modo ” --onefile ” es una historia diferente y no se admite en Windows. Tendrás que cavar más para resolver eso.

Estoy usando Pytorch para generar el archivo ejecutable. Funciona bien cuando se ejecuta el archivo .py, sin embargo, cuando generé un archivo exe usando pyinstaller, se mantiene el bucle.

 python -F inference_resnet101.py 

Esto me salva:

 if __name__ == '__main__': # Pyinstaller fix multiprocessing.freeze_support() main()