Включение небуферизованного вывода в ведении журнала python 3.x (с графическим интерфейсом wxPython)

У меня есть приложение с графическим интерфейсом 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 в сочетании с процессом упаковки делает это немного сложным.


person Joe Healey    schedule 26.06.2019    source источник
comment
На какой ОС вы находитесь?   -  person user803422    schedule 26.09.2019
comment
Извините, да, должен был сказать. Это на OSX 10.14. Python через conda в PyCharm. Я получу версии модулей и прочее, когда вернусь к своему компьютеру.   -  person Joe Healey    schedule 26.09.2019
comment
Это странно... Согласно stackoverflow. com/questions/16633911/, ведение журнала по умолчанию немедленно сбрасывает все выходные данные.   -  person Legorooj    schedule 30.09.2019
comment
это вопросы и ответы stackoverflow.com/questions/21071448/ как-то близко к вашей проблеме? Или stackoverflow.com/questions/881696/?   -  person LoneWanderer    schedule 30.09.2019
comment
stackoverflow.com/questions/107705/disable-output-buffering поможет ? Особенно 4 вариант.   -  person OrdoFlammae    schedule 30.09.2019
comment
@OrdoFlammae Боюсь, что нет. Как я упоминал в ОП, установка буфера на 0 больше не поддерживается в Py3. Я изучу класс Unbuffered(), предложенный в первом ответе, спасибо.   -  person Joe Healey    schedule 02.10.2019