сетка не печатает на консоли в режиме реального времени - PullRequest
4 голосов
/ 18 марта 2020

Использование Python print() (или, насколько мне известно, любой другой генерации вывода консоли) в структурах l oop и запуск кода через reticulate в R, вывод печатается только после завершения выполнения. Например, возьмите следующее l oop, которое после каждой итерации засыпает на 1,5 секунды; номера прогонов печатаются в одном go после того, как l oop закончен. То же самое касается сохранения кода Python в отдельном файле .py и последующего запуска reticulate::py_run_file().

library(reticulate)

py_run_string("
import time

for i in range(5):
   print(str(i))
   time.sleep(1.5) # sleep for 1.5 sec
")

Кто-нибудь знает, откуда происходит это поведение и, если возможно, как его обойти?

Ответы [ 2 ]

4 голосов
/ 18 марта 2020

Очевидно, вам нужно заставить pyhton экспортировать стандартный вывод время от времени. Вы можете сделать это, добавив sys.stdout.flush() к своему коду:

library(reticulate)

py_run_string("
import time
import sys

for i in range(5):
   print(str(i))
   time.sleep(1.5) # sleep for 1.5 sec
   sys.stdout.flush()
")

см. Здесь, описанное с nohup

2 голосов
/ 27 марта 2020

Для дальнейшего использования, принудительное выполнение flu sh, поток через print(..., flush = True) также работает (как предложено здесь ) и делает импорт sys устаревшим:

library(reticulate)

py_run_string("
import time

for i in range(5):
   print(str(i), flush = True)
   time.sleep(1.5)
")
...