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