我的打印语句在 try\except 循环中不起作用



我做了一个小函数,充当计时器,随着几分钟的进行更新行(在这里放一秒钟进行测试。

我想使用 KeyboardInterrupt 退出程序的这一部分,所以使用了 try/except 方法,但发生了一些奇怪的事情。

使用 try/except,屏幕上不会打印任何内容。当我执行 Ctrl-C 时,所有语句一起打印(一个接一个(,输入语句看起来很好。

喜欢这个:

ou have been working for 0 minutesYou have been working for 1 minutesYou have been working for 2 minutesYou have been working for 3 minutesYou have been working for 4 minutesYou have been working for 5 minutesYou have been working for 6 minutesYou have been working for 7 minutesYou have been working for 8 minutesYou have been working for 9 minutesYou have been working for 10 minutesYou have been working for 11 minutesAre you sure you want to finish your working session ? (y/n)

这是我的代码:

def timer():
    minutes = 0
    startDateTime = datetime.datetime.now()
    stringDateTime = startDateTime.strftime('%m/%d/%Y, at %H:%M:%S' )
    while True:
        try:
            time.sleep(1)
            print('You have been working for {} minutes'.format(minutes), end='')
            minutes += 1
        except KeyboardInterrupt:
            choice = input('Are you sure you want to finish your working session ? (y/n)')
            if choice == 'y':
                    log_time(stringDateTime, minutes)
            elif choice == 'n':
                    pass
            pass

这种行为是 try/except 固有的吗?

如果是,我可以使用哪些其他解决方案?

最好!

默认情况下,Python 将使用缓冲输出。由于sys.stdout是文本流,因此通常在发出换行符时进行解缓冲,但代码不会发出任何换行符。

如果你让你的程序运行一段时间,我怀疑你最终会看到缓冲区填满时大量的输出。

要强制取消缓冲,只需使用

sys.stdout.flush()

当您想确保到目前为止打印的所有内容都已发出时。

正如@wjandrea在对另一个答案的评论中指出的那样,在print的论点中添加flush=True是一个更简单的解决方案。

@holdenweb已经解释了它。我只是为了更清楚而添加它。

如果您尝试像这样打印,那么它将被保存在缓冲区中,并且在循环退出后将输出所有内容。 在这种情况下,长度为 13 的字符串需要 13 秒。

import time 
strn = "StackOverflow"
for i in range(0, len(strn)): 
    print(strn[i], end ="")
    time.sleep(1)

但是通过刷新,它将每秒输出一个字符。

import time 
import sys
strn = "StackOverflow"
for i in range(0, len(strn)): 
    print(strn[i], end ="")
    sys.stdout.flush()
    time.sleep(1)

由于您没有在打印语句的末尾打印换行符,因此它不会被刷新到输出。尝试在每次打印后致电sys.stdout.flush()

最新更新