【问题标题】:Python3: print(somestring,end='\r', flush=True) shows nothingPython3: print(somestring,end='\r', flush=True) 什么也不显示
【发布时间】:2016-04-13 21:40:27
【问题描述】:

我正在按照How to animate the command line? 的建议编写进度条。我使用 Pycharm 并在运行工具窗口中运行此文件。

import time
def show_Remaining_Time(time_delta):
    print('Time Remaining: %d' % time_delta, end='\r', flush=True)

if __name__ == '__main__':
    count = 0
    while True:
        show_Remaining_Time(count)
        count += 1
        time.sleep(1)

但是,如果我运行此 .py 文件,则代码不会显示任何内容。我做错了什么?


我尝试了 Jogger 的建议,但如果我使用 print 函数,它仍然无法正常工作。

但是,以下脚本按预期工作。

import time
import sys
def show_Remaining_Time(time_delta):
    sys.stdout.write('\rtime: %d' % time_delta) # Doesn't work if I use 'time: %d\r'
    sys.stdout.flush()
if __name__ == '__main__':
    count = 0
    while True:
        show_Remaining_Time(count)
        count += 1
        time.sleep(1)

我现在有 2 个问题:

  1. 为什么 stdout 有效,而 print() 无效。

  2. 为什么How to animate the command line? 建议将\r 附加到末尾,而我必须在开头写它?

【问题讨论】:

  • 在交互式解释器中对我来说很好。你是否有机会在一个奇怪的 shell 中运行,比如 IDLE shell?
  • @ShadowRanger 我正在使用 Pycharm 的运行工具窗口运行它。如果我没有通过end='\r',它会正常打印。但我想继续更新同一行。
  • 是的,PyCharm 的运行窗口不是一个普通的终端。它不会以您可能想要的方式处理回车。在正常的命令提示符下运行。
  • 嗯...如果可行,Jorge 可能是对的; PyCharm 必须在回车时擦除。 print 会起作用,但你会这样做:print('\rTime Remaining: %d' % time_delta, end='', flush=True) 代替(所以回车首先打印,而不是最后打印)。
  • @ShadowRanger 是的,它有效!必须通过end='' 否则它也不起作用。

标签: python pycharm python-3.4


【解决方案1】:

问题是最后的'\r'清除了你刚刚打印的那行,怎么办?

import time
def show_Remaining_Time(time_delta):
    print("\r", end='')
    print('Time Remaining: %d' % time_delta, end='', flush=True)

if __name__ == '__main__':
    count = 0
    while True:
        show_Remaining_Time(count)
        count += 1
        time.sleep(1)

这样,您首先清除该行,然后打印所需的显示,并在睡眠期间将其保持在屏幕上。

注意:上面的代码已修改为添加 end='',如 cmets 中所建议的那样,代码可以在某些平台上正常工作。感谢其他读者帮助制定更完整的答案。

【讨论】:

  • 在我知道的大多数终端上,\r 不会清除任何内容。它移动光标,但需要进一步的输出来覆盖那里的内容。此外,您没有为任何一个打印禁用自动换行,因此最终效果是将每个输出打印在新行上;显式的 '\r' print 什么都不做。
  • 除了其他问题(如不使用 end=''),这对我有用。
  • 我必须使用print('\r', end='')print('output', end='', flush=True) 才能使这项工作按我的预期进行。不过感谢您的良好起点!
【解决方案2】:

此方法可以在同一命令行打印:

import time
def show_Remaining_Time(time_delta):
     print(' \r%d:Time Remaining' % time_delta, end = '',flush=False)

if __name__ == '__main__':
    count = 0
    while True and count < 10:
        show_Remaining_Time(count)
        count += 1
        time.sleep(1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 2021-03-17
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多