我正在运行一个python脚本,由于某种原因该脚本被杀死,因此,不会打印stdout。我知道我可以使用sys.stdout.flush()
获得缓冲的标准输出。但是,由于我不知道脚本何时被杀死,因此我可能会错过最后一次刷新和实际进程结束之间的时间。例如,下面的代码仅在60年代睡眠结束之前保存“ test 1”。如果在此之前终止程序,则我的日志文件将仅包含“ test 1”打印内容。
import sys,time
sys.stdout = open('log', 'w')
print("test 1")
sys.stdout.flush()
print("test 2")
time.sleep(60)
如何在杀死脚本之前捕获最后的标准输出?即使我在60年代的睡眠结束之前杀死了脚本,如何获得“ test 2”打印?
答案 0 :(得分:1)
通话
sys.stdout.flush()
将缓冲区中的所有内容写入文件。 所有的打印操作是将对象写入到 提供,因此在强制结束时可能未刷新缓冲区。 应该查看一下以获取更多信息print function。
如果您希望它在每次打印时都冲洗缓冲区,请通过冲洗参数,如下所示:
import sys,time
sys.stdout = open('log', 'w')
print("test 1", flush=True)
print("test 2", flush=True)
time.sleep(60)
答案 1 :(得分:0)
您可以使用print()函数的flush=True
参数。编写一个装饰器,以刷新装饰功能内部所做的所有打印。
import functools
def flush_prints(f):
@functools.wraps(f)
def decorated(*args, **kwargs):
global print
# Flush calls made to print(...)
print = functools.partial(print, flush=True)
f_returns = f(*args, **kwargs)
# Restore back
print = functools.partial(print, flush=False)
return f_returns
return decorated
因此装饰这样的功能将刷新该功能内部的所有打印内容:
@flush_prints
def test():
print("test 1")
time.sleep(10)
print("test 2")
time.sleep(10)
test()