2

После недавней переустановки Cygwin у меня возникло странное поведение - в этом терминале вывод работающего приложения не отображается при записи, но неожиданно появляется при определенных условиях.

Для моей конкретной ситуации я использую сервер Django:

python manage.py runserver

Это должно выдавать несколько сообщений о состоянии в терминал по мере вращения сервера, а также отображать запросы и ответы сервера (в дополнение к операторам print Python). Ни один из них не появляется.

Однако, когда я изменяю файл, который является частью приложения Django, сервер перезагружается автоматически (как и должно быть), и все выходные данные неожиданно появляются для предыдущего сеанса.

Предыдущая установка Cygwin работала нормально.

Единственное известное различие, которое у меня есть, заключается в том, что предыдущая установка использовала Cygwin Python (в /usr/bin), а моя новая установка использовала Windows Pyton (в /cygdrive/c/Python27). Это было сделано для целей подключения данных MySQL.

Еще одна странность, которая может указывать на большую проблему, заключается в том, что после запуска сервера Cygwin требуется 2 нажатия кнопки закрытия (в правом верхнем углу «X»), чтобы закрыть окно терминала. Первый щелчок делает терминал бесполезным, но само окно остается; второй щелчок удаляет его с экрана.

Кто-нибудь сталкивался с ситуацией, когда Cygwin не обновляет вывод терминала и нашел удобное исправление?

1 ответ1

3

Проблема здесь заключается в комбинации различных установок Python и поведения "сбрасывания" Python.

Промывка означает запись чего-либо из памяти в файл или на экран. Когда хорошо разработанная программа записывает что-то на экран, она обнаруживает это и немедленно записывает ("очищает") это на экран, чтобы это можно было увидеть немедленно. Однако, если программа выполняет запись в файл на диске, выполнение большого количества мелких записей в файл выполняется намного медленнее, чем одно большое, поэтому она будет "буферизовать" небольшие записи до тех пор, пока их не будет скопировано в файл при один раз. Это то, что делает Python.

Проблема, с которой вы сталкиваетесь, заключается в том, что Python Cygwin понимает, что MinTTY является терминалом, и поэтому часто переключается на него, но Windows Python не может определить разницу между терминалом MinTTY и файлом на диске. Предполагается, что записываемый файл является файлом, поэтому он ставит в очередь записи и сбрасывает их в пакетном режиме (перезапуск приложения вызовет это), а не сбрасывает каждое сообщение по мере его появления. Если вы подождете достаточно долго (по-видимому, достаточно для очереди сообщений объемом 64 КБ), вы также увидите, что все они одновременно записываются на экран.

Есть два решения: либо найти способ обойти ваши проблемы с MySQL, чтобы вы могли использовать Cygwin Python, либо использовать Windows Python из оболочки Windows cmd, которая будет правильно определена как терминал и, таким образом, приведет к правильному поведению сброса.

Вам также может повезти, если вы отключите буферизацию Python. Если вы запускаете Python с параметром -u или добавляете sys.stdout.flush() после операторов print, это предотвратит буферизацию сообщений Python и заставит его немедленно сбросить их на экран.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .