Вы можете видеть stdout тем временем, обратившись к AsyncResult.stdout
, который вернет список строк, которые являются стандартными для каждого движка.
Простейший случай существо:
print ar.stdout
Вы можете обернуть это в простой функции, которая печатает на стандартный вывод, пока вы ждете для AsyncResult выполнения:
import sys
import time
from IPython.display import clear_output
def wait_watching_stdout(ar, dt=1, truncate=1000):
while not ar.ready():
stdouts = ar.stdout
if not any(stdouts):
continue
# clear_output doesn't do much in terminal environments
clear_output()
print '-' * 30
print "%.3fs elapsed" % ar.elapsed
print ""
for eid, stdout in zip(ar._targets, ar.stdout):
if stdout:
print "[ stdout %2i ]\n%s" % (eid, stdout[-truncate:])
sys.stdout.flush()
time.sleep(dt)
example notebook, иллюстрирующий эту функцию.
Теперь, если вы используете старый IPython, вы можете увидеть искусственное ограничение на доступ к атрибуту stdout (ошибки «Неготовность результата»). Информация доступна в метаданных, так что вы все еще можете получить на него, пока задача не сделать:
rc.spin()
stdout = [ rc.metadata[msg_id]['stdout'] for msg_id in ar.msg_ids ]
Который по существу то же самое, что доступ ar.stdout
атрибут делает.
Awesome, спасибо много! Я очень ценю вашу работу над параллельным IPython и усилия, которые вы вложили в этот ответ. Отличная работа! – rodion
Ноутбук должен быть, вероятно, обновлен, потому что 'any (stdouts)' вызывает исключение. : - / –