Как заставить программу python ждать между командами

Albert Garcia спросил: 12 мая 2018 в 04:45 в: python

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

import time
from time import sleept=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 ответ

Есть решение
abarnert ответил: 12 мая 2018 в 05:27

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

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

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


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

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


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

print(t, flush=True)

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

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

... но вы, вероятно, не хотите сделайте это.


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

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

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


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

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