Python 3.4:调用print后time.sleep()意外挂起

5 投票
1 回答
2392 浏览
提问于 2025-04-18 10:37

这是我第一次发帖,请大家轻点!

我在使用Python 3.4,操作系统是Win 7时,发现time.sleep()有时候会意外地卡住。我搜索了一下,但找到的问题都没有解决我的困惑。以下这段代码运行得很正常:

from time import sleep

def am_i_running():
    while True:
        print('starting test')
        sleep(0.5)
        print(".", end="")

if __name__ == '__main__':
    am_i_running()

它会先打印出'starting'测试,然后不断输出'.starting test'的行。但是如果我把'starting'这个消息的位置移动成这样:

from time import sleep

def am_i_running():
    while True:
        sleep(0.5)
        print(".", end="")

if __name__ == '__main__':
    print('starting test')
    am_i_running()

这段代码会打印出'starting test',然后就一直卡在那儿——但只有在作为脚本运行的时候才会这样。如果我把这个模块导入到Idle里并调用'am_i_running()',它就能正常工作。而且,如果我完全不输出'starting test',从命令行运行也没问题。看起来问题出在print语句的位置,而不是time.sleep()本身。

我猜这可能是个特性,而不是个bug;但我不太明白。希望这里有人能给我解释一下。

1 个回答

2

输出是被缓冲的,直到行结束时才会显示。因为你的 print(".", end="") 语句后面没有换行符,所以它的缓冲区一直没有被清空。问题不在于你在睡眠前有一个 print,而是因为在你的第一个例子中,每次循环都会打印一个换行符,而在第二个例子中,启动信息后面没有打印换行符。

你可以看到其他关于这个问题的讨论。这个链接 提供了一个简单的答案:

import sys
sys.stdout.flush()

撰写回答