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

时间:2018-06-05 18:25:43

标签: python time sleep

我在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)

1 个答案:

答案 0 :(得分:1)

默认情况下,print打印到sys.stdout,在写入交互式终端时为行缓冲, 1 ,但在写入文件时会进行块缓冲。 / p>

因此,当您使用终端或命令提示符中的python myscript.py运行代码时,您会看到每行都会根据需要显示。

但是如果你用python myscript.py >outfile来运行它,那么在缓冲区填满之前不会写入任何内容(或者直到脚本退出,如果这种情况从未发生过)。通常情况下,这很好。但显然,无论你在Komodo中运行你的脚本,它看起来都像Python的常规文件,而不是交互式终端。

您可以通过不同的方式使用或配置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标志或PYTHONUNBUFFERED环境变量的无缓冲输出。但这在Python 3中可能没有任何好处。 2

1。正如sys.stdout所解释的那样,它只是一个常规文本文件,就像open返回的文件一样。正如open中所述,这种区别是通过调用isatty

来实现的

2。 Python 2的stdout只是C stdio对象的一个​​薄包装器,所以如果你打开它没有缓冲,那就没有缓冲。 Python 3' s stdout是原始文件描述符的重要包装器,它自己进行缓冲和解码(有关详细信息,请参阅io文档),因此-u将使sys.stdout.buffer.raw生成sys.stdout 1}}无缓冲,但-u本身仍将被缓冲,如SET group_concat_max_len=5000; SELECT group_concat(v.name separator '; ') FROM ( SELECT concat('RENAME TABLE `', t.table_name, '` TO `', replace(t.table_name, 'wp_', 'wplocal_'), '`') name FROM information_schema.tables t WHERE table_name like 'wp_%' ) v; 文档中所述。