2012-02-27 26 views
18

Tengo una aplicación escrita en Python y compilada con PyInstaller. También usa PyQt para el marco de GUI.Windows: Inicio lento de la aplicación

Al ejecutar esta aplicación, se produce un retraso de aproximadamente 10 segundos antes de que se cargue y se muestre la ventana principal. Por lo que puedo decir, esto no se debe a la lentitud en mi código. En cambio, sospecho que esto se debe a la inicialización del tiempo de ejecución de Python.

El problema es que esta aplicación se inicia con una aplicación personalizada laucncher/barra de tareas. El usuario hará clic en el botón para iniciar la aplicación, verá que nada parece suceder y haga clic en otra parte en otra aplicación. Cuando mi aplicación muestra su ventana, no puede aparecer en primer plano debido a las reglas de SetForegroundWindow.

Tengo acceso a la fuente del cargador PyInstaller win32, el código Python e incluso el código del iniciador.

Mis preguntas son:

  • Cómo puedo hacer que esta aplicación se inicie más rápido?

  • ¿Cómo puedo medir el tiempo que gasto en los primeros segundos de la vida útil del proceso?

  • ¿Cuál es la técnica generalmente aceptada para reducir el tiempo hasta que se muestre la primera ventana?

me gustaría evitar la adición de una pantalla de bienvenida por dos razones - uno, espero que no ayudará a (la sobrecarga es antes de que acabe el código Python) y dos, simplemente no me gusta pantallas de inicio :)

Si fuera necesario, probablemente podría editar el talón del cargador PyInstaller para crear una ventana, pero esa es otra ruta que preferiría no tomar.

Gracias por las sugerencias.

Respuesta

1

He 'compilado' unas pocas aplicaciones wxPython usando py2exe y cx_Freeze, ninguna de ellas toma más de 4 segundos para comenzar.

  • ¿Estás seguro de que no es tu código? tal vez alguna red o alguna llamada de recursos de E/S sosteniendo su aplicación?
  • ¿Has probado otra máquina que la tuya? Incluso el hardware más rápido puede ser lento a veces con una configuración de software, aplicaciones o SO incorrectos, pruébelo.
  • Pruebe a sincronizarlo con el módulo timeit.

Nunca utilicé pyQT, pero con wxPython la velocidad de inicio es correcta, y después de la primera inicialización si cierro y abro nuevamente, es más rápido que la primera vez.

8

Sospecho que está utilizando el modo "un archivo" de pyinstaller: este modo significa que debe descomprimir todas las bibliotecas en un directorio temporal antes de que la aplicación pueda comenzar. En el caso de Qt, estas bibliotecas son bastante grandes y tardan unos segundos en descomprimirse. Intente usar el modo "un directorio" y vea si eso ayuda.

10

Indique a PyInstaller que cree un ejecutable en modo consola. Esto le proporciona una consola que puede usar para la depuración.

En la parte superior de su secuencia de comandos principal, incluso antes de ejecutar la primera importación, agregue una impresión "Inicio de código Python". Luego ejecuta tu ejecutable empaquetado desde la línea de comando. De esta forma, puede obtener una idea clara de si el tiempo se pasa en el gestor de arranque de PyInstaller o en su aplicación.

El gestor de arranque de PyInstaller suele ser bastante rápido en el modo de un solo directorio, pero puede ser mucho más lento en el modo de archivo único, ya que lo empaqueta todo en un directorio temporal. En Windows, la E/S es muy lenta, y luego tienes antivirus que querrán verificar dos veces todos esos archivos DLL.

PyQt en sí no es un problema. PyQt es generado por SIP, que genera enlaces perezosos muy rápidos; importar todo el PyQt es más rápido que cualquier otra biblioteca GUI porque básicamente no hace nada: todos los enlaces a las clases/funciones se crean dinámicamente cuando (¡y si!) se accede a ellos, ahorrando también mucha memoria.

Si su aplicación tarda en aparecer, eso será cierto sin PyInstaller también. En ese caso, su única solución es una pantalla emergente (importe solo PyQt, cree QApplication, cree una pantalla en la pantalla secundaria, luego importe el resto de su programa y ejecútelo) o vuelva a procesar su código. No puedo ayudarte mucho sin detalles.

+0

Tenías razón, creé una aplicación más simple y, de hecho, el tiempo de inicio se volvió casi instantáneo. Estoy usando el modo onedir. Creo que el problema son mis varias importaciones. Tengo mucho más seguimiento que hacer. –

+0

Guau, gracias por el consejo sobre antivirus. Una vez que desactivé mi AV, mi exe se aceleró. – iridescent

1

Acepto las respuestas anteriores. Mi programa Qt python necesitó aproximadamente 5 segundos para iniciarse en una PC decente cuando se usa el modo de archivo único. Después de cambiar a --edir, solo me llevó alrededor de un segundo comenzar; casi inmediatamente después de que el usuario hace doble clic en el archivo exe. Pero el inconveniente es que hay muchos archivos en ese directorio que no es tan claro.

Cuestiones relacionadas