我做了一个小函数,充当计时器,随着几分钟的进行更新行(在这里放一秒钟进行测试。
我想使用 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()
。