2017-01-27 3 views
0

Так что я только хочу, чтобы повторно запустить код из этого репо: https://github.com/dennybritz/reinforcement-learning/blob/master/MC/MC%20Prediction%20Solution.ipynbsys.stdout.flush не работает в jupyter ноутбук

Мое внимание сосредоточено на части принт:

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(), чтобы создать простой «прогресс». Вы можете увидеть выход из его репо он только показывает последний эпизод итерация 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, чтобы сделать это работает?

+0

Это '\ r's, которые вызывают перезапись , а не 'flush()' - это просто гарантирует, что содержимое не застряло в буфере. Поскольку он фокусируется на чем-то отличном от ключевого компонента, это немного запутанно, как написано в настоящее время. –

+0

oh .. Я не знаю о символе '\ r' там, спасибо :) теперь ясно. – malioboro

ответ

0

Комментарий Charless Duffy делает все понятным. Проблема перезаписи не связана с функцией буферизации флеша в функции печати.

Я нашел решение просто изменить формат печати из:

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

в

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

и перезапись теперь работает

+0

Если ваш stdout был не отложен (вместо буферизации по строке, как обычно, для TTY), это будет работать без 'flush()' * вообще *. Описывать его как «флеш», который работает или не имеет большого смысла. –

+0

Правильно, я думаю, что флеш - это тот, кто ответственен за переписывание, просто догадываясь, я не знал о символе '\ r', спасибо, что отредактирую его – malioboro

+1

или' '' print "\ rEpisode {}/{}. ".format (i_episode, num_episodes),' '' в случае python 2.x – kampta

Смежные вопросы