8

我有一个非常简单的应用程序:

import sys
from time import sleep

for i in range(3):
    sys.stdout.write('.')
    sleep(1)

print('Welcome!')

我希望它每秒打印一个点(3 次),之后它应该显示“欢迎!”。不幸的是,它只是等待三秒钟,然后立即打印出所有内容。我在运行常规 Python 2.7 的 mac 上,我不知道为什么这段代码会这样。有什么建议么?

4

4 回答 4

13

这是因为sys.stdout被缓冲了。使用flush

import sys
from time import sleep

for i in range(3):
    sys.stdout.write('.')
    sys.stdout.flush()
    sleep(1)

print('Welcome!')
于 2013-07-12T08:43:11.953 回答
5

你可以调用 python-u来使 stdin、stdout 和 stderr 完全无缓冲。这将使您不必手动冲洗它们。

在 Unix 上,调用你的脚本python -u myscript.py

或者你可以把它放在shebang中:#!/usr/bin/python -u

于 2013-07-12T13:12:46.583 回答
1

stdout是一个缓冲流。缓冲区在到达换行符时被隐式刷新。

如果要在不写入换行符的情况下刷新缓冲区,则必须通过调用显式执行此操作sys.stdout.flush()

另一种选择是写入stderr未缓冲的 。

于 2013-07-12T08:48:40.410 回答
0

你应该使用printor logger

如果你想要你期望的行为,你需要使用sys.flush来强制输出。

于 2013-07-12T08:43:34.050 回答