Приложение, созданное с помощью PyInstaller, имеет медленный запуск - PullRequest
30 голосов
/ 27 февраля 2012

У меня есть приложение, написанное на Python и «скомпилированное» с помощью PyInstaller. Он также использует PyQt для структуры GUI.

Запуск этого приложения имеет задержку около 10 секунд, прежде чем загружается главное окно и отображается. Насколько я могу судить, это не из-за медлительности в моем коде. Вместо этого я подозреваю, что это связано с инициализацией среды выполнения Python.

Проблема в том, что это приложение запускается с пользовательским приложением laucncher / taskbar. Пользователь нажимает кнопку для запуска приложения, видит, что ничего не происходит, и щелкает в другом месте другого приложения. Когда мое приложение показывает свое окно, оно не может выйти на передний план из-за правил для SetForegroundWindow.

У меня есть доступ к исходному коду для загрузчика Win32 PyInstaller, коду Python и даже к коду запуска.

Мои вопросы:

  • Как я могу ускорить запуск этого приложения?

  • Как измерить время, проведенное в первые несколько секунд жизни процесса?

  • Каков общепринятый метод сокращения времени до отображения первого окна?

Я бы хотел избежать добавления заставки по двум причинам: во-первых, я ожидаю, что это не поможет (накладные расходы - до запуска кода Python), и во-вторых, мне просто не нравятся заставки:)

Если мне нужно, я мог бы, вероятно, отредактировать заглушку загрузчика PyInstaller, чтобы создать окно, но это другой путь, который я бы предпочел не использовать.

Ответы [ 5 ]

20 голосов
/ 28 февраля 2012

Скажите PyInstaller, чтобы создать исполняемый файл в режиме консоли. Это дает вам рабочую консоль, которую вы можете использовать для отладки.

В верхней части основного сценария, даже до запуска первого импорта, добавьте печать «Запуск кода Python». Затем запустите упакованный исполняемый файл из командной строки. Таким образом, вы можете получить четкое представление о том, тратится ли время в загрузчике PyInstaller или в вашем приложении.

Загрузчик PyInstaller, как правило, работает довольно быстро в режиме с одним каталогом, но в режиме с одним файлом он может быть намного медленнее, потому что он все складывает во временный каталог. В Windows ввод-вывод очень медленный, и у вас есть антивирусы, которые захотят перепроверить все эти DLL-файлы.

PyQt сам по себе не проблема. PyQt генерируется SIP, который генерирует очень быстрые ленивые привязки; импорт всего PyQt выполняется быстрее, чем любая другая библиотека графического интерфейса, потому что он в основном ничего не делает: все привязки к классам / функциям создаются динамически, когда (и если!) вы обращаетесь к ним, что также экономит много памяти.

Если ваше приложение запускается медленно, это будет верно и без PyInstaller. В этом случае ваше единственное решение - это либо заставка (импортируйте только PyQt, создайте QApplication, создайте отображение заставки, затем импортируйте оставшуюся часть вашей программы и запустите ее), либо переработайте код. Я не могу вам помочь без подробностей.

16 голосов
/ 27 февраля 2012

Я подозреваю, что вы используете режим "одного файла" pyinstaller - этот режим означает, что он должен распаковать все библиотеки во временный каталог, прежде чем приложение сможет запуститься.В случае с Qt эти библиотеки довольно велики и для их распаковки требуется несколько секунд.Попробуйте использовать режим «один каталог» и посмотрите, поможет ли это?

2 голосов
/ 09 апреля 2013

Я согласен с ответами выше.Моей программе на Python Qt потребовалось около 5 секунд для запуска на приличном ПК при использовании режима одного файла.После того, как я перешел на --onedir, для запуска потребовалось всего около секунды;почти сразу после того, как пользователь дважды щелкнет исполняемый файл.Но недостаток в том, что в этом каталоге много файлов, которые не так аккуратны.

2 голосов
/ 27 февраля 2012

Я «скомпилировал» несколько приложений wxPython, используя py2exe и cx_Freeze, ни одному из них не требуется более 4 секунд для запуска.

  • Вы уверены, что это не ваш код? может быть, какая-то сеть или какой-то вызов ресурсов ввода-вывода удерживает ваше приложение?
  • Вы пробовали другую машину, чем ваша? Даже самое быстрое оборудование может иногда работать медленно с неправильной конфигурацией программного обеспечения, приложений или ОС, попробуйте.
  • Попробуйте синхронизировать его с модулем timeit.

Я никогда не использовал pyQT, но с wxPython скорость запуска в порядке, и после первой инициализации, если я снова закрываюсь и открываюсь, это быстрее, чем в первый раз.

0 голосов
/ 18 марта 2018

Для моего приложения длительное время запуска почти полностью было вызвано антивирусной системой.Отключение этого параметра уменьшило запуск в моем случае с 3 минут до менее 10 секунд!

Чтобы представить эти измерения в перспективе: мое приложение было связано с дополнительными файлами данных (около 150 файлов с полезной нагрузкой 250 МБ), кромеперенос вокруг Qt и numpy (это может зависеть от Intel MKL, который сам добавляет еще 200 МБ в комплект!) зависимостей.Даже не сильно помогло то, что тестируемая система работала с твердотельным накопителем ...

В заключение: если у вас большое приложение с большим количеством зависимостей, время запуска может сильно зависеть отантивирусная система!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...