Я запускаю скрипт python, который по какой-то причине убивается, и из-за этого stdout не печатается. Я знаю, что могу получить буферизованный стандартный вывод с sys.stdout.flush()
. Однако, поскольку я не знаю, когда скрипт убит, я могу пропустить время между последней очисткой и фактическим завершением процесса. Например, следующий код будет сохранен только "тест 1" до окончания 60-х годов сна. Если я убью программу до этого, мой файл журнала будет содержать только печать «test 1».
import sys,time
sys.stdout = open('log', 'w')
print("test 1")
sys.stdout.flush()
print("test 2")
time.sleep(60)
Как я могу поймать последний стандартный вывод перед тем, как скрипт будет убит? Как я могу получить отпечаток «test 2», даже если я убью скрипт до того, как закончится сон 60-х годов?
Как убивается ваша программа? По KeyboardInterrupt
? По SystemExit
? Или что-то другое?
Я не знаю. Я оставил его включенным и по какой-то причине его убили. И это не в первый раз.
звонящий
sys.stdout.flush()
Запишет в файл все, что находится в буфере. Все, что делает print, это записывает объекты в поток выходного файла, который при условии, что при принудительном завершении буфер не мог быть сброшен. следует взглянуть на это для получения дополнительной информации функция печати.
Если вы хотите, чтобы он очищал буфер при каждой печати, передайте параметр flush следующим образом:
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)
Спасибо, но это работает только с отпечатками. Если у меня в буфере есть что-нибудь еще, я его пропущу.
Вы можете использовать параметр flush=True
функции print (). Напишите декоратора, чтобы смыть все отпечатки, сделанные внутри декорированной функции.
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()
Взгляните сюда: stackoverflow.com/questions/881696/…