Python: получить последний вывод, прежде чем он будет убит

Я запускаю скрипт 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-х годов?

Взгляните сюда: stackoverflow.com/questions/881696/…

tomer.z 27.10.2018 11:43

Как убивается ваша программа? По KeyboardInterrupt? По SystemExit? Или что-то другое?

N Chauhan 27.10.2018 11:51

Я не знаю. Я оставил его включенным и по какой-то причине его убили. И это не в первый раз.

Miguel 27.10.2018 12:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
538
2

Ответы 2

звонящий

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)

N Chauhan 27.10.2018 11:55

Спасибо, но это работает только с отпечатками. Если у меня в буфере есть что-нибудь еще, я его пропущу.

Miguel 27.10.2018 12:14

Вы можете использовать параметр 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()

Другие вопросы по теме