Python:在终止之前获取最后的输出

时间:2018-10-27 09:39:07

标签: python stdout

我正在运行一个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”打印?

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()