У меня есть приложение с графическим интерфейсом Py3.x, которое я создавал с помощью Gooey
. Приложение полностью функционально, а графический интерфейс работает так, как предполагалось, за исключением встроенной консоли/терминала, получающего буферизованный вывод.
Это не проблема, если я запускаю файл .py
с pythonw -u script.py
, однако сейчас я пытаюсь связать/заморозить инструмент в файле .app
. Процесс объединения сработал, но все еще остается проблема с буферизацией вывода при открытии приложения.
До сих пор я нашел следующее, но ничего из того, что я пробовал, не сработало:
В нескольких потоках предлагалось использовать
flush=True
сprint()
для записи при каждом вызове, ноlogging
— что меня здесь интересует — не имеет такого дополнительного флага. Следовательно, различные решения по исправлению обезьян в этом потоке также бесполезны для меня (с оговоркой, что я плохо знаю внутренностиlogging
, так что, возможно, есть аналогичный подход, примененный к регистратору, который мог бы работать?Gooey
сам по себе , и процесс упаковки выводит гораздо больше информации о журнале, чем мои собственные вызовы, и они все еще буферизуются, поэтому кажется, что «глобальная разбуферизация» — это то, что действительно необходимо в любом случае.Эта ветка предлагает ряд подходов. Действительно, рекомендуемый подход — это повторное открытие
sys.stdout
с нулевым размером буфера, однако в первом треде есть противоречивое мнение о том, работает ли он на Python 3 в свете PIP 3116, и, конечно же, в моих руках использованиеnonbuffered_stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) sys.stdout = nonbuffered_stdout
кажется, вообще ломает
.app
.Попытка «вставить»
-u
илиPYTHONUNBUFFERED=1
в shebangs также не работает (в данном случае на MacOS) с-S
или без него.
Итак, TL;DR:
Как можно добиться небуферизованного вывода в Python 3.x, когда скрипт явно не вызывается с помощью python3 -u
?
Я все еще пытаюсь собрать MWE, но использование gooey
в сочетании с процессом упаковки делает это немного сложным.
Unbuffered()
, предложенный в первом ответе, спасибо. - person Joe Healey   schedule 02.10.2019