Подтвердить что ты не робот

Как вывести на консоль и файл?

Я пытаюсь найти способ в Python перенаправить журнал выполнения скрипта в файл, а также стандартный stdout Python. Есть ли простой способ добиться этого?

4b9b3361

Ответ 1

Я придумал этот [untested]

import sys

class Tee(object):
    def __init__(self, *files):
        self.files = files
    def write(self, obj):
        for f in self.files:
            f.write(obj)
            f.flush() # If you want the output to be visible immediately
    def flush(self) :
        for f in self.files:
            f.flush()

f = open('out.txt', 'w')
original = sys.stdout
sys.stdout = Tee(sys.stdout, f)
print "test"  # This will go to stdout and the file out.txt

#use the original
sys.stdout = original
print "This won't appear on file"  # Only on stdout
f.close()

print>>xyz в python ожидает функцию write() в xyz. Вы можете использовать свой собственный пользовательский объект, который имеет это. Или, кроме того, вы можете также иметь sys.stdout для вашего объекта, и в этом случае он будет изменен даже без >>xyz.

Ответ 2

Использовать модуль регистрации (http://docs.python.org/library/logging.html):

import logging

logger = logging.getLogger('scope.name')

file_log_handler = logging.FileHandler('logfile.log')
logger.addHandler(file_log_handler)

stderr_log_handler = logging.StreamHandler()
logger.addHandler(stderr_log_handler)

# nice output format
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_log_handler.setFormatter(formatter)
stderr_log_handler.setFormatter(formatter)

logger.info('Info message')
logger.error('Error message')

Ответ 3

Я просто хочу ответить на вызов Serpens и добавить строку:

logger.setLevel('DEBUG')

Это позволит вам выбрать, какой уровень сообщения будет зарегистрирован.

Например, пример Serpens,

logger.info('Info message')

Не будет записываться, поскольку по умолчанию он записывает только предупреждения и выше.

Подробнее о используемых уровнях читайте здесь

Ответ 4

Вы должны использовать библиотеку logging, в которой есть эта возможность. Вы просто добавляете обработчики в регистратор, чтобы определить, куда отправить вывод.

Ответ 5

Возможно, самое короткое решение:

def printLog(*args, **kwargs):
    print(*args, **kwargs)
    with open('output.out','a') as file:
        print(*args, **kwargs, file=file)

printLog('hello world')

Записывает "hello world" в sys.stdout и output.out и работает точно так же, как print().

Примечание: Не указывайте аргумент файла для функции printLog. Вызовы типа printLog('test',file='output2.out') не поддерживаются.

Ответ 6

Самое простое решение - перенаправить стандартный вывод. В вашем файле программы python используйте следующее:

if __name__ == "__main__":
   sys.stdout = open('file.log', 'w')
   #sys.stdout = open('/dev/null', 'w')
   main()

Любой STD-вывод (например, вывод print 'hi there') будет перенаправлен на file.log или если вы раскомментируете вторую строку, любой выход будет просто подавлен.

Ответ 7

Создайте выходной файл и пользовательскую функцию:

outputFile = open('outputfile.log', 'w')

def printing(text):
    print(text)
    if outputFile:
        outputFile.write(str(text))

Затем вместо print (text) в вашем коде вызовите функцию печати.

printing("START")
printing(datetime.datetime.now())
printing("COMPLETE")
printing(datetime.datetime.now())

Ответ 8

Здесь небольшое улучшение по сравнению с классом @UltraInstinct Tee, которое было изменено, чтобы быть менеджером контекста, а также фиксирует любые исключения

import traceback
import sys

# Context manager that copies stdout and any exceptions to a log file
class Tee(object):
    def __init__(self, filename):
        self.file = open(filename, 'w')
        self.stdout = sys.stdout

    def __enter__(self):
        sys.stdout = self

    def __exit__(self, exc_type, exc_value, tb):
        sys.stdout = self.stdout
        if exc_type is not None:
            self.file.write(traceback.format_exc())
        self.file.close()

    def write(self, data):
        self.file.write(data)
        self.stdout.write(data)

    def flush(self):
        self.file.flush()
        self.stdout.flush()

Чтобы использовать менеджер контекста:

print("Print")
with Tee('test.txt'):
    print("Print+Write")
    raise Exception("Test")
print("Print")