如何让 python 程序在命令之间等待

How to have python program wait in between commands

我在 Komodo 上使用 python 3,我希望在执行命令之间有时间延迟。然而,使用下面的代码,所有的打印命令同时启动,但它确实显示所有命令执行后的时间比命令执行前的时间长两秒。有没有办法打印第一行,等待第二行,打印第二行,等待一秒钟,然后打印第三行和第四行?

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)

默认情况下,print prints to sys.stdout在写入交互式终端时是行缓冲的,1但在写入文件时是块缓冲的。

因此,当您在终端或命令提示符中使用 python myscript.py 运行 代码时,您会看到每一行都按预期打印出来。

但是如果你 运行 它与,比方说,python myscript.py >outfile,在缓冲区填满之前不会写入任何内容(或者直到脚本退出,如果从未发生的话)。通常,这很好。但显然,无论你如何 运行 在 Komodo 中运行你的脚本,对于 Python.

它看起来就像一个普通文件,而不是交互式终端

您可以通过不同方式使用或配置 Komodo 来解决这个问题。

我对 Komodo 了解不多,但我确实看到有 an addon for embedding a terminal;也许如果你使用它而不是将输出发送到内置 JavaScript (?) 控制台,事情会更好,但我真的不知道。


或者,您可以通过手动操作确保在每一行之后刷新输出缓冲区,例如,通过传递 flush argument to 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)

如果您在 Stack Overflow 或网络上搜索,您会发现很多关于禁用缓冲的建议。并且您 可以 强制 Python 使用带有 -u flag or the 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 文档中所述。