PyCharm Python控制台-在同一行上打印无法正常工作


问题内容

我的目标是通过用当前进度覆盖上一行来显示控制台中的加载进度。我已经找到了许多适用于Python版本3的解决方案,但是这些解决方案无法正常工作。

例如:

import time
for i in range(10):
    print(i, end='', flush=True)
    time.sleep(1)

给我以下输出:

0123456789

或两者:

import time
for i in range(10):
    print(i, end='\r', flush=True)
    time.sleep(1)

和:

import time
for i in range(10):
    print("\b" + str(i), end='', flush=True)
    time.sleep(1)

给我以下输出:

0
1
2
3
...

任何想法 ?我正在使用带有Anaconda软件包的PyCharm Community Edition。

非常感谢!

编辑:当我运行python文件(使用PyCharm)时,似乎没有发生此问题,但仅当我执行“在控制台中执行选择”时


问题答案:

您需要控制对stdout的写入和刷新。因此,ma3oun给出的链接很有价值。不幸的是,PyCharm控制台的工作原理不同于命令行。有关其工作方式的问题,应直接联系PyCharm团队,并可能要求他们更改此行为。

无论如何,解决问题的方法是在执行写操作之前添加\ r:

import sys
import time

for i in range(10):
    sys.stdout.write("\r{0}".format(str(i)))
    sys.stdout.flush()
    time.sleep(1)

但是,对于较短的睡眠时间(例如0.1),刷新短缓冲区存在问题。对于每次刷新,您获得的不仅仅是打印的一个写入值。作为一种解决方法,我发现您可以添加另一个\
r:

for i in range(10):
    sys.stdout.write("\r \r {0}".format(str(i)))
    sys.stdout.flush()
    time.sleep(0.1)

这将强制控制台仅显示一个写入值,但是您会在两次显示之间失去一些值,因为它看起来像刷新速率慢于0.1秒。

我的进度条解决方案已正确显示在PyCharm控制台中:

import sys
import time

progressVis = {0: '          ', 1: '-         ', 2: '--        ', 3: '---       ', 4: '----      ', 5: '-----     ',
               6: '------    ', 7: '-------   ', 8: '--------  ', 9: '--------- ', 10: '----------'}

size = 20
for i in range(0, size):
    percent = int((float(i + 1) / size) * 10)
    str1 = "\r \r [{0}] {1}/{2} {3}%".format(progressVis[percent],
                                                 i + 1, size,
                                                 ((i + 1) * 100 / size))
    sys.stdout.write(str1)
    sys.stdout.flush()
    time.sleep(0.1)