网状不实时打印到控制台

9
使用Python的print()(或者据我所知,任何其他控制台输出生成)函数在循环结构中,并通过reticulate在R中运行代码时,输出只会在执行完成后打印。例如,以下循环每次迭代后都会睡眠1.5秒;在循环结束后,所有的运行数字都会一起打印出来。当将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
")

有人知道这个行为来自哪里,如果可能的话,如何规避它吗?


1
这似乎是 Python 的问题。当您将其放入脚本中并使用 nohup thisscript.py 运行它时,您会发现输出将被保留,直到脚本完成。这只是我的经验。不幸的是,我不知道为什么。 - loki
太棒了,将print()调用之后立即插入sys.stdout.flush()确实在每次迭代时向控制台发送状态更新。谢谢! - fdetsch
2个回答

7

作为参考,通过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)
")

5

有时候需要强制使Python输出标准输出。您可以通过将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的描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接