Отладка связанного исполняемого файла, который работает с консолью, но не без - PullRequest
1 голос
/ 05 июля 2019

Я работаю над сценарием (приложение с графическим интерфейсом PyQt5), который отлично работает как есть, а также работает, как и предполагалось, на исполняемый файл, созданный с консоли. Я не могу избавиться от консоли, потому что она немедленно вылетает с «Fatal error».

Можно ли получить подробную информацию о проблеме? Я попытался debug=True в спецификации скрипта, он показывает все виды сообщений процесса, пытается запустить основной файл и вылетает с той же фатальной ошибкой. Я также добавил следующий фрагмент кода в начале, чтобы перенаправить все сообщения печати:

file = open('output.txt', 'a')
sys.stdout = file
main.run()
file.close()

Опять же, все работает нормально как есть, но преобразование его в не консольный exe сразу приводит к сбою.

Может кто-нибудь сообщить мне, как найти подробную информацию о проблеме «Неустранимая ошибка»?

Спасибо.

1 Ответ

0 голосов
/ 06 июля 2019

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

Во-первых, если вы перенаправляетеstdout в файл, это хорошая мысль, но вы также должны перенаправить stderr.

Лучше использовать модуль Python logging, который является частью стандартной библиотеки,написать трассировку ошибок в файл.Дополнительным преимуществом является то, что файл журнала может также отлавливать ценную отладочную информацию из задействованных библиотек, поскольку logging - это наиболее часто используемый способ сообщения о некритических ошибках и предупреждениях.

Для демонстрации:

import logging

logging.basicConfig(filename='log.txt', level=logging.DEBUG)
try:
    raise OSError('Emulated exception to be traced back to in log file.')
except Exception:
    logging.error('A critical error occurred.', exc_info=True)

Здесь вы указываете записать всю информацию журнала в файл с именем log.txt в той же папке, что и .exe.Вы должны обернуть блок try: ... except: вокруг главной точки входа (main.run() в вашем примере).Параметр exc_info=True обеспечивает полное отслеживание ошибок ранее необработанного исключения, включенного в файл журнала.

...