Как заставить программу Python ждать между командами - PullRequest
0 голосов
/ 05 июня 2018

Я использую python 3 на Komodo, и я хочу, чтобы между выполнением команд была задержка.Однако, используя приведенный ниже код, все команды печати запускаются одновременно, но это показывает, что время после выполнения всех команд на две секунды больше, чем время до выполнения команд.Можно ли напечатать первую строку, подождать вторую, напечатать вторую строку, подождать секунду и напечатать третью и четвертую строки?

import time
from time import sleep

t=time.asctime(time.localtime(time.time()));
print(t)

time.sleep(1)

print('Good Night')

time.sleep(1)

print('I"m back')
t=time.asctime(time.localtime(time.time()));
print(t)

1 Ответ

0 голосов
/ 05 июня 2018

По умолчанию print печатает в sys.stdout, который буферизуется при записи в интерактивный терминал, 1 , но буферизуется в блокепри записи в файл.

Итак, когда вы запустите свой код с помощью python myscript.py из своего терминала или командной строки, вы увидите, что каждая строка отображается в том виде, в котором она напечатана, по желанию.

Но если вы запустите его, скажем, с помощью python myscript.py >outfile, ничего не будет записано, пока буфер не заполнится (или пока скрипт не завершится, если этого никогда не произойдет).Обычно это нормально.Но, очевидно, как бы вы ни выполняли ваш скрипт в Komodo, он выглядит как обычный файл, а не интерактивный терминал для Python.


Возможно, вы можете это исправить, просто используя или настраивая Komodoиначе.

Я не знаю много о Комодо, но я вижу, что есть аддон для встраивания терминала ;возможно, если вы используете это вместо отправки вывода на встроенную консоль JavaScript (?), все будет работать лучше, но я действительно понятия не имею.


В качестве альтернативы, вы можете убедиться, что буфер выводаочищается после каждой строки, делая это вручную, например, передавая аргумент flush в print:

print(t, flush=True)

Если вы действительно хотите, вы можете дажезамените print в вашем модуле функцией, которая всегда делает это:

import builtins
import functools
print = functools.partial(builtins.print, flush=True)

… но вы, вероятно, не хотите этого делать.


В качестве альтернативы, вы можете заменитьsys.stdout с файловым объектом с линейной буферизацией над необработанным стандартным выводом, просто вызвав open в соответствующем файле или дескрипторе файла:

sys.stdout = open(sys.stdout.fileno(), buffering=1)

Если выПоиск по переполнению стека или в Интернете, вы найдете много предложений, чтобы отключить буферизацию.И вы можете заставить Python использовать небуферизованный вывод с флагом -u или переменной среды PYTHONUNBUFFERED.Но это может не принести пользы в Python 3. 2


1.Как объясняет sys.stdout, это обычный текстовый файл, подобный тем, которые возвращаются open.Как объяснено в open, это различие проводится путем вызова isatty.

2.stdout в Python 2 - это просто тонкая оболочка вокруг объекта C stdio, поэтому если вы откроете его без буферизации, буферизация не будет.stdout в Python 3 - это здоровенная оболочка для необработанного файлового дескриптора, которая выполняет свою собственную буферизацию и декодирование (подробности см. В документах io), поэтому -u сделает sys.stdout.buffer.raw небуферизованной, ноsys.stdout само по-прежнему будет буферизовано, как объяснено в -u документах.

...