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

Перенаправлять отпечатки в файл журнала

Хорошо. Я завершил свою первую программу python. У нее около 1000 строк кода. Во время разработки я разместил множество операторов print перед запуском команды, используя os.system() скажем что-то вроде:

print "running command",cmd
os.system(cmd)

Теперь я закончил программу. Я подумал о том, чтобы комментировать их, но перенаправляю всю эту ненужную печать (я не могу удалить все операторы print - поскольку некоторые предоставляют полезную информацию для пользователя) в файл журнала будет более полезен? Любые трюки или подсказки.

4b9b3361

Ответ 1

Python позволяет вам записывать и назначать sys.stdout - как упоминалось - для этого:

import sys
old_stdout = sys.stdout

log_file = open("message.log","w")

sys.stdout = log_file

print "this will be written to message.log"

sys.stdout = old_stdout

log_file.close()

Ответ 2

Вы должны посмотреть модуль регистрации python


EDIT: Пример кода:

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG, filename="logfile", filemode="a+",
                        format="%(asctime)-15s %(levelname)-8s %(message)s")
    logging.info("hello")

Создайте файл с именем "logfile" с контентом:

2012-10-18 06:40:03,582 INFO     hello

Ответ 3

  • В следующий раз вы будете счастливее, если вместо использования инструкций print вы будете использовать модуль logging с самого начала. Он предоставляет требуемый элемент управления, и вы можете записать его в stdout, пока он еще там, где вы хотите.

  • Многие люди предложили перенаправить stdout. Это уродливое решение. Он мутирует глобальный и, что еще хуже, он мутирует его для использования этого модуля. Я бы скорее сделал регулярное выражение, которое меняет все print foo на print >>my_file, foo и устанавливает my_file на stdout или фактический файл по моему выбору.

    • Если у вас есть другие части приложения, которые на самом деле зависят от написания на stdout (или когда-либо в будущем, но вы еще этого не знаете), это нарушает их. Даже если вы этого не сделаете, это делает чтение вашего модуля похожим на одно, когда оно действительно делает другое, если вы пропустили одну маленькую линию вверх.
    • Печать Chevron довольно уродлива, но не так уродлива, как временное изменение sys.stdout для процесса.
    • Очень технически говоря, замена регулярного выражения не способна сделать это правильно (например, он может создавать ложные срабатывания, если вы находитесь внутри многострочного литерала строки). Тем не менее, он подходит для работы, просто следите за ним.
  • os.system практически всегда уступает использованию модуля subprocess. Последние не должны вызывать оболочку, не пропускают сигналы таким образом, который обычно нежелателен, и могут использоваться неблокируемым образом.

Ответ 4

Вы можете перенаправить замену sys.stdout на любой объект, который имеет тот же интерфейс, что и sys.stdout, в этом объекте write вы можете печатать на терминал и в файл тоже. например см. этот рецепт http://code.activestate.com/recipes/119404-print-hook/

Ответ 6

Вы можете создать файл журнала и подготовить его для записи. Затем создайте функцию:

def write_log(*args):
    line = ' '.join([str(a) for a in args])
    log_file.write(line+'\n')
    print(line)

а затем замените имя функции print() на write_log()

Ответ 7

Вставка собственного файла в sys.stdout позволит вам выводить текст через print.

Ответ 8

Просто примечание о добавлении и режиме записи. Измените filemode на "w", если вы хотите заменить файл журнала. Я также должен был закомментировать поток. Затем с помощью logging.info() выводился в указанный файл.

if __name__ == '__main__':
    LOG_FORMAT = '%(asctime)s:%(levelname)s ==> %(message)s'
    logging.basicConfig(
        level=logging.INFO,
        filename="logfile",
        filemode="w",
        format=LOG_FORMAT
        #stream=sys.stdout
    )