python3 为什么 print("\r"+"text") 在 linux 和 windows 终端上不同

python3 why is print("\r"+"text") different on linux and windows terminal

在学习的过程中 python3 我写了一个小程序,在控制台上显示一个 ascii 艺术条形图。我为这个方法提供了一些随机数字,这样我就可以看到条形图是如何工作的。因此我希望它在同一行上一遍又一遍地打印条形图,而不是添加 LF。

在 linux 主机上运行良好的部分在 windows 主机上运行不佳。

为什么?!我该如何为任何平台解决这个问题?

for i in range(500):
    print( "\r" + getProgressBar( progressPercentage=limitedRandGen(), width=consoleWidth ), end="" )
    time.sleep(50 / 1000) # delays for x seconds

linux 上的这段代码在同一行上输出每个条形图(一遍又一遍地覆盖它,这很好)。在 windows 上,每个条形图后面都有一个 LF,结果是这样的:

47% [==================================================================================
45% [==============================================================================
46% [=================================================================================
42% [=========================================================================
38% [==================================================================
40% [======================================================================
40% [=====================================================================
43% [===========================================================================
46% [===============================================================================
50% [=======================================================================================
48% [====================================================================================
49% [=====================================================================================
46% [================================================================================
47% [=================================================================================
46% [================================================================================
43% [==========================================================================
43% [==========================================================================
41% [=======================================================================
45% [==============================================================================
41% [=======================================================================
44% [============================================================================
42% [=========================================================================
41% [========================================================================
44% [============================================================================
46% [================================================================================
47% [==================================================================================

注意:getProgressBar() 方法只是 returns 一个完全没有 CR+LF 的字符串。

与此同时,我发现由于某些未知原因 windows 会添加一个 LF(也称为换行),如果某些字符被写入控制台线。

所以我的代码无法保持在同一行上,直到我将打印宽度减小到至少 maxConsoleWidth-1,这解决了问题。

以下在 Mac OS 中运行良好。

import sys
import time
import random

def getRandomLine():
    r = random.randrange(1,20)
    return str(r) + '% ' + '=' * random.randrange(1,20)

for i in range(20):
    print(getRandomLine().ljust(30) + '\r', end='')
    sys.stdout.flush()
    time.sleep(0.5)