我在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)
答案 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;
文档中所述。