Как перенаправить предупреждения Python в пользовательский поток?

Допустим, у меня есть файловый объект, такой как StreamIO, и я хочу, чтобы модуль предупреждений python записывал в него все предупреждающие сообщения. Как я могу это сделать?

3 ответа

Решение

Попробуйте переназначить предупреждения.

#!/sw/bin/python2.5

import warnings, sys

def customwarn(message, category, filename, lineno, file=None, line=None):
    sys.stdout.write(warnings.formatwarning(message, category, filename, lineno))

warnings.showwarning = customwarn
warnings.warn("test warning")

перенаправит все предупреждения на стандартный вывод.

Я думаю, что-то вроде этого будет работать, хотя это непроверенный код и интерфейс выглядит так, что есть более чистый способ, который ускользает от меня в настоящее время:

import warnings

# defaults to the 'myStringIO' file
def my_warning_wrapper(message, category, filename, lineno, file=myStringIO, line=None):
    warnings.show_warning(message, category, filename, lineno, file, line)    

warnings._show_warning = my_warning_wrapper

Если заглянуть внутрь Lib\warnings.py, это поможет вам выбрать правильный путь, если этого недостаточно.

import sys
import StringIO

sys.stdout = StringIO.StringIO()
Другие вопросы по тегам