sys.stdout не выводит в файл при компиляции через pyinstaller
Столкнулся с такой проблемой. Для удобства переноса исполняемого файла с ботом в Телеграмме, я использую библиотеку pyinstller для сборки .exe файла. Работает в целом хорошо, но только есть один момент. При аварийном завершении кода в окно терминала пишется текст ошибки и окно после этого быстро пропадает, не давая возможности ошибку посмотреть. Решил сделать вот так:
sys.stderr = open('err.txt', 'a')
sys.stdout = open('out.txt', 'a')
print('setup complete')
При компиляции в .exe и запуске его, оба файла создаются. Ошибки в первый пишутся, а вот во второй файл к примеру та же надпись setup complete уже не попадает. К тому же она и в консоль не выводится. Куда она пропадает?
Если строку sys.stdout = open('out.txt', 'a') закомментировать и пересобрать файл без нее, контрольная надпись в консоли уже будет.
Ответы (1 шт):
Чтобы вопрос не болтался.. хотя полноценного ответа на данный вопрос нет, есть замечание, что стандартный поток и ошибки всё же выводятся в соответствующие файлы. Однако это происходит только тогда, когда скомпилированный файл завершил свою работу и более не является процессом. По его завершении весь стандартный поток также выводится в файл (out.txt в данном случае). Различное (на первый взгляд) поведение потока ошибок и потока выводов обусловлено тем, что при возникновении необработанного исключения работа скомпилированного файла также обрывается и весь вывод пишется в файл. А если программа работает штатно и "долго" (особенно характерно для Телеграмм ботов), вывод в файл будет заморожен до завершения процесса.