【问题标题】:Python 3.4: time.sleep() hangs unexpectely when preceeded by a print callPython 3.4:time.sleep() 在 print 调用之前意外挂起
【发布时间】:2014-06-21 19:13:33
【问题描述】:

我是第一次,所以要温柔!

使用 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()

它打印“开始”测试,然后是无限序列的“.开始测试”行。但是,如果我移动“开始”消息,以便我拥有:

from time import sleep

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

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

这会打印“开始测试”,然后永远挂起——但仅当作为脚本运行时。如果我将模块导入 Idle 并调用'am_i_running()',它就可以了。此外,如果我完全省略“开始测试”输出,它也可以在命令行中正常工作。问题似乎在于 print 语句的位置,而不是 time.sleep 本身。

我猜这是一个特性,而不是一个错误;但我不明白。希望这里有人可以启发我。

【问题讨论】:

    标签: python


    【解决方案1】:

    输出被缓冲,直到行尾才会显示。由于您的 print(".", end="") 在末尾不包含换行符,因此它永远不会刷新缓冲区。不是因为你睡前有print;问题是,在您的第一个示例中,每次循环迭代都会打印一个换行符,但在您的第二个示例中,在启动消息之后没有打印换行符。

    您可以查看有关此的其他问题。 This one 给出了一个简单的答案:

    import sys
    sys.stdout.flush()
    

    【讨论】:

    • 感谢您的回复。我没有考虑缓冲影响。我可以看到该解决方案有效。但是,我仍然对为什么有问题的代码 sn-p 版本在从 Idle 内(或从 shell 内)调用时工作正常感到困惑。导入函数和从脚本调用函数之间存在脱节。
    • @user3763469:shell 和/或 IDLE 可能已关闭缓冲。一些交互式 shell 这样做是因为在交互式设置中,无缓冲输出通常是有意义的(它是交互式的,因此人们希望看到输出发生时)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2020-07-05
    • 2014-06-20
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多