100 votes

L'application créée avec PyInstaller a un démarrage lent

J'ai une application écrite en Python et 'compilée' avec PyInstaller. Elle utilise également PyQt comme framework GUI.

Lancer cette application a un retard d'environ 10 secondes avant que la fenêtre principale ne se charge et ne s'affiche. Autant que je sache, cela n'est pas dû à la lenteur de mon code. Je soupçonne plutôt que cela est dû à l'initialisation de l'exécution de Python.

Le problème est que cette application est lancée avec un lanceur de tâches personnalisé / de la barre des tâches. L'utilisateur cliquera sur le bouton pour lancer l'application, ne verra rien se passer, puis cliquera ailleurs sur une autre application. Lorsque ma fenêtre d'application s'affiche, elle ne peut pas passer au premier plan en raison des règles pour SetForegroundWindow.

J'ai accès au code source du chargeur win32 de PyInstaller, du code Python, et même du code du lanceur.

Mes questions sont:

  • Comment puis-je faire démarrer cette application plus rapidement ?

  • Comment puis-je mesurer le temps passé dans les premières secondes de la durée de vie du processus ?

  • Quelle est la technique généralement acceptée pour réduire le temps jusqu'à ce que la première fenêtre s'affiche ?

J'aimerais éviter d'ajouter un écran de chargement pour deux raisons - premièrement, je pense que cela ne servira à rien (le surcoût est avant que le code Python ne s'exécute) et deuxièmement, je n'aime tout simplement pas les écrans de chargement :)

Si nécessaire, je pourrais probablement modifier le bouchon de chargeur PyInstaller pour créer une fenêtre, mais c'est une autre voie que je préférerais ne pas emprunter.

3voto

Termintenator Points 11

J'ai résolu ce problème en ajoutant une exception au logiciel de surveillance antivirus (F-Secure). Cela a supprimé l'attente de plusieurs minutes avant de s'exécuter.

1voto

Jun Points 51

J'ai eu le même problème de lancement lent, et j'ai fini par utiliser l'option "--onedir" à la place, en créant un raccourci vers un dossier au-dessus du dossier de distribution créé par pyinstaller afin de pouvoir facilement trouver l'exécutable.

Voici la commande en lot "build.bat"

--

rem build with pyinstaller

C:\Python310\Scripts\pyinstaller.exe --onedir -w --noconfirm MyProg.py

rem create shortcut

set TARGET='C:\MyProgDir\dist\MyProg.exe'
set SHORTCUT='C:\MyProgDir\MyProg.exe.lnk'
set PWS=powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile
%PWS% -Command "$ws = New-Object -ComObject WScript.Shell; $s = $ws.CreateShortcut(%SHORTCUT%); $S.TargetPath = %TARGET%; $S.Save()"

0voto

J'ai 'compilé' quelques applications wxPython en utilisant py2exe et cx_Freeze, Aucune d'entre elles ne prend plus de 4 secondes pour démarrer.

  • Êtes-vous sûr que ce n'est pas votre code ? peut-être qu'un appel réseau ou à une ressource I/O retarde votre application ?
  • Avez-vous essayé sur une autre machine que la vôtre ? Même le matériel le plus rapide peut parfois être lent avec une mauvaise configuration logicielle, des applications ou un système d'exploitation, essayez.
  • Essayez de chronométrer avec le module timeit.

Je n'ai jamais utilisé pyQT, mais avec wxPython la vitesse de démarrage est OK, et après la première initialisation si je ferme et ouvre à nouveau, c'est plus rapide que la première fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X