【问题标题】:Python: get the last output before it gets killedPython:在它被杀死之前获取最后一个输出
【发布时间】:2018-10-27 09:39:07
【问题描述】:

我正在运行一个 python 脚本,由于某种原因被杀死,因此没有打印标准输出。我知道我可以使用sys.stdout.flush() 获得缓冲的标准输出。但是,由于我不知道脚本何时被杀死,我可能会错过上次刷新和实际进程结束之间的时间。例如,下面的代码是否在 60 秒睡眠结束前只保存“测试 1”。如果我在此之前终止程序,我的日志文件将只包含“test 1”打印。

import sys,time

sys.stdout = open('log', 'w')
print("test 1")
sys.stdout.flush()
print("test 2")
time.sleep(60) 

如何在脚本被杀死之前捕获最后一个标准输出?即使我在 60 年代睡眠结束之前杀死脚本,如何获得“测试 2”打印?

【问题讨论】:

  • 你的程序是如何被杀死的?通过KeyboardInterrupt?通过SystemExit?还是别的什么?
  • 我不知道。我让它运行,由于某种原因,它被杀死了。而且不是第一次了。

标签: python stdout


【解决方案1】:

打电话

sys.stdout.flush()

将缓冲区中的任何内容写入文件。 所有 print 所做的就是将对象写入输出文件流 提供这样当强制结束时缓冲区可能没有被刷新。 应该看看这个以获取更多信息print function

如果您希望它在每次打印时刷新缓冲区,请像这样传递刷新参数:

import sys,time

sys.stdout = open('log', 'w')
print("test 1", flush=True)
print("test 2", flush=True)
time.sleep(60) 

【讨论】:

  • 也许你可以合并一个包装器,它接受参数并隐式添加flush。即flush = lambda *args: print(*args, flush=True)
  • 谢谢,但这仅适用于打印。如果缓冲区中还有其他内容,我会错过的。
【解决方案2】:

您可以使用 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多