【问题标题】:My print statement doesn't work in a try\except loop我的打印语句在 try\except 循环中不起作用
【发布时间】:2019-06-13 13:15:44
【问题描述】:

我做了一个作为计时器的小功能,随着时间的推移更新线路(在这里放一秒钟进行测试。

我想使用 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 固有的吗?

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

最好的!

【问题讨论】:

  • 这可能是您的打印功能永远不会刷新,因为您没有以换行符结束它。尝试将参数 flush=True 添加到您的 print() 调用中。
  • 输出默认缓冲。
  • 顺便说一句,您的代码可以在我的 ipython notebook 中正常运行。
  • flush = True 确实会输出代码。尽管如此,它并没有像以前的代码那样“替换”每个打印,它只是并排打印。
  • 解决方案我添加了end = '\r'

标签: python python-3.x


【解决方案1】:

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

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

要强制去缓冲,只需使用

sys.stdout.flush()

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

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

【讨论】:

    【解决方案2】:

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

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

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

    但是使用flush,它会每秒输出一个字符。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • flush=True 添加到print() 调用比sys.stdout.flush() 更简单。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多