【问题标题】:sys.stdout.flush not work in jupyter notebooksys.stdout.flush 在 jupyter notebook 中不起作用
【发布时间】:2017-06-12 18:57:10
【问题描述】:

所以我只想从这个 repo 重新运行代码: https://github.com/dennybritz/reinforcement-learning/blob/master/MC/MC%20Prediction%20Solution.ipynb

我的重点是印刷部分:

 for i_episode in range(1, num_episodes + 1):
        # Print out which episode we're on, useful for debugging.
        if i_episode % 1000 == 0:
            print "\rEpisode {}/{}.".format(i_episode, num_episodes)
            sys.stdout.flush()

他正在使用 sys.stdout.flush() 创建一个简单的“进度”输出。您可以从他的 repo 中看到输出,它只显示最后一个 Episode 迭代 10000/10000,因为使用 sys.stdout.flush()

但是当我尝试在我的 jupyter 笔记本中运行它时(我使用 cmd 命令 jupyter notebook 运行)我认为 sys.stdout.flush() 不起作用,它会显示每个打印的迭代,而不是覆盖前一个:

Episode 1000/10000.
Episode 2000/10000.
Episode 3000/10000.
Episode 4000/10000.
Episode 5000/10000.
Episode 6000/10000.
Episode 7000/10000.
Episode 8000/10000.
Episode 9000/10000.
Episode 10000/10000.

在运行 jupyter 以使其正常工作时,我是否遗漏了什么?

【问题讨论】:

  • 导致覆盖的是\rs,而不是flush()——这只是确保内容不会卡在缓冲区中。因为它关注的不是关键组件,所以现在写的有点混乱。
  • 哦.. 我不知道那里有\r 符号,谢谢:) 现在清楚了

标签: python jupyter-notebook flush


【解决方案1】:

Charless Duffy 的评论让一切变得清晰。覆盖的问题不在flush函数上,而是在print函数上。

我发现解决方案只是从以下位置编辑打印格式:

print("\rEpisode {}/{}.".format(i_episode, num_episodes))

print("\rEpisode {}/{}.".format(i_episode, num_episodes), end="")

现在覆盖工作

【讨论】:

  • 如果你的标准输出是非缓冲的(而不是行缓冲的,这通常是 TTY 的默认值),这将在没有flush()完全的情况下工作。将其描述为有效或无效的“同花顺”没有多大意义。
  • 没错,我认为flush是负责覆盖的,只是猜测而已,我不知道那里有\r符号,谢谢我会编辑它
  • print "\rEpisode {}/{}.".format(i_episode, num_episodes), 在 python 2.x 的情况下
【解决方案2】:

Python 程序打印不带换行符的列表

声明一个列表
import time
listfruits = ['Apple', 'Banana', 'Orange', 'Mango']
使用for循环打印列表
for fruit in listfruits:
    print('\r'+fruit, end=' ')
    time.sleep(3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多