Я использую 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)
По умолчанию
print
печатает наsys.stdout
, который буферизируется по строке при записи на интерактивный терминал, 1 , но буферизируется при записи в файл.Итак, когда вы запускаете свой код с помощью
python myscript.py
из своего терминала или командной строки, вы увидите, что каждая строка отображается по мере ее печати. Но если вы запустите его, скажем,
python myscript.py >outfile
, ничего не будет написано до тех пор, пока буфер не заполнится (или пока скрипт не выйдет, если этого не произойдет). Обычно это нормально. Но, видимо, однако, вы используете свой сценарий в Komodo, он выглядит как обычный файл, а не интерактивный терминал, для Python.Возможно, вы можете исправить это, просто используя или настраивая Комодо по-разному.
Я мало знаю о Komodo, но я вижу, что есть аддон для встраивания терминала; возможно, если вы используете это вместо отправки вывода во встроенную консоль JavaScript (?), все будет работать лучше, но я действительно понятия не имею.
В качестве альтернативы вы можете убедиться, что выходной буфер после каждой строки выполняется кратковременное удаление, например, путем передачи аргумента
flush
вprint
:If вы действительно хотите, вы можете даже заменить
print
в своем модуле функцией, которая всегда делает это:... но вы, вероятно, не хотите сделайте это.
В качестве альтернативы вы можете заменить
sys.stdout
на объект строки с буферизацией строки по исходному stdout, просто позвонивopen
в его базовую необработанный файл или файловый дескриптор:Если вы просматриваете Stack Overflow или в Интернете, вы найдете множество предложений по отключению буферизации. И вы можете заставить Python использовать небуферизованный вывод с флагом
-u
или переменнойPYTHONUNBUFFERED
. Но это не может сделать ничего хорошего в Python 3. 21. Как объясняет
sys.stdout
, это обычный текстовый файл, например те, которые возвращаютсяopen
. Как объясняется вopen
, это различие производится путем вызоваisatty
.2. Python 2
stdout
- это всего лишь тонкая оболочка объекта C stdio, поэтому, если вы открываете ее без буферизации, буферизации нет. Python 3stdout
- это мощная оболочка вокруг файлового дескриптора, который выполняет собственную буферизацию и декодирование (подробности см. В документахio
), поэтому-u
sys.stdout.buffer.raw
небуферизованный, ноsys.stdout
сам по-прежнему будет буферизован, как описано в документах-u
.