【问题标题】:PyCharm Python Console - Printing on the same line not working as intendedPyCharm Python 控制台 - 在同一行打印未按预期工作
【发布时间】:2017-09-16 19:55:49
【问题描述】:

我的目标是通过用当前进度覆盖上一行来在我的控制台中显示加载进度。我找到了很多 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 社区版下工作。

非常感谢!

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

【问题讨论】:

标签: python console pycharm


【解决方案1】:

您需要控制写入标准输出并刷新它。所以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)

【讨论】:

  • 感谢您的回答。然而它并没有解决问题(对我来说)。进度显示在新行中,而不是覆盖以前的进度(我要求的)。
  • 你使用的是什么版本的 python 和 PyCharm?我正在开发 python 2.7 和 2017.1.3 PyCharm 版本。
  • Python 3.6 和 PyCharm 2016.3.2。也许我必须更新我的 PyCharm !
  • 我已经安装了 Python 3.6,并且我的代码按预期工作。如果可以解决您的问题,请更新 PyCharm 并分享。根据我在更新到 2017 后的记忆,在 v2016 上创建的项目存在一些问题,因此请确保在您确定该项目可以在较新版本上运行之前将这两个版本都保留在您的 PC 上。
  • 赞成这个答案和the other one,因为他们帮助我走上了正确的道路。对于每个说它不起作用的人:检查您是否正在写信给stdout而不是stderr!这个 sn-p 在写入 PyCharm 的 stderr 控制台时不起作用(似乎它根本不支持回车)。此外,必须将回车放在行的开头而不是结尾,因为这样控制台会吞下该行,不显示任何内容。除此之外,工作就像一个魅力,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2022-11-24
  • 2019-12-30
相关资源
最近更新 更多