Как перенаправить предупреждения Python в пользовательский поток? - PullRequest
7 голосов
/ 13 мая 2009

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

Ответы [ 3 ]

13 голосов
/ 13 мая 2009

Попробуйте переназначить warnings.showwarning , т.е.

#!/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")

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

0 голосов
/ 13 мая 2009
import sys
import StringIO

sys.stdout = StringIO.StringIO()
0 голосов
/ 13 мая 2009

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

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, и вы окажетесь на правильном пути, если этого недостаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...