Python time.sleep прерывается после нажатия на терминал - PullRequest
0 голосов
/ 02 октября 2018

Я строю инструменты командной строки, используя скрипт Python.это цикл проверки данных и распечатки некоторых вещей через несколько секунд задержки.Работает нормально, пока я ничего не нажму или не выделю текст мышью на терминале без события клавиатурыпосле этого он ничего не делает, не печатает и не перепроверяет

import time
import sys
print('some thing')
for remaining in range(10, 0, -1):
    sys.stdout.write("\r")
    sys.stdout.write("recheck in {:2d}.".format(remaining))
    sys.stdout.flush()
    time.sleep(1)

sys.stdout.write("\rComplete!            \n")
input()

Моя среда - анаконда 64 бит на windows 10

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Консоль блокируется в функции Windows SDK WriteConsole, поскольку окно консоли находится в режиме, называемом QuickEdit mode.

Чтобы устранить проблему, перейдите к параметру свойств в верхнем левом углу меню консоли.

Затем снимите флажок в режиме QuickEdit.

Режим QuickEdit предназначен для помощи в копировании и вставке текста из консоли.Поэтому, когда консоль находится в этом режиме, она останавливает всю запись в консоль, так что текст не перемещается, пока вы пытаетесь выделить и скопировать / вставить.

0 голосов
/ 02 октября 2018

Python значительно изменил свою системную обработку сигналов в Python 3.5.https://www.python.org/dev/peps/pep-0475/

Используется для выдачи InterruptedError всякий раз, когда сигнал прерывает системный вызов.Теперь код оболочки системного вызова при прерывании сигнала будет вызывать системный вызов , при необходимости пересчитывая любые тайм-ауты .Ошибка на этом уровне может вызвать системный вызов с абсурдно длинным значением.

Присоедините отладчик и посмотрите, где находится процесс, когда он застрял.

РЕДАКТИРОВАТЬ: после прикрепления windbg к залипшей консоли.Я обнаружил, что это не проблема.Я выложил реальное решение в новом ответе.

...