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)