2016-12-15 2 views
0

В python можно перенаправить sys.stderr на метод экземпляра класса? Пробовав и не воспользовавшись стандартным модулем регистрации в сочетании с модулем многопроцессорности, я прибегал к написанию собственного собственного регистратора. Хотя это может быть плохой альтернативой, мне нужны только базовые возможности ведения журнала, и бесконечные ошибки сериализации сводили меня с ума. Короче говоря, я хотел бы сделать что-то вроде:Перенаправить sys.stderr в метод экземпляра класса?

import sys 
class TestClass(): 

    def test_method(msg): 
     acquire threading lock and write to file 

logger = TestClass() 
sys.stderr = logger.test_method 

Это можно сделать?

ответ

1

Любой файлоподобный объект может использоваться как stderr - его даже не нужно выводить из file и в основном просто нужен метод write(). По сути, вам просто нужно набрать test_method как write и назначить sys.stderrlogger, а не logger.test_method. Вы также можете реализовать flush(), возможно ничего не делая.

class TestClass(): 

    def write(msg): 
     # acquire threading lock and write to file 

    def flush(): 
     pass 

logger = TestClass() 
sys.stderr = logger 

Вы также могли бы реализовать __enter__ и __exit__ методы, чтобы сделать вашу работу класса в качестве менеджера контекста, особенно, если есть очистки необходимо (например, восстановление stderr к обычному файлу).

+0

Я попытался запустить этот код, заменив комментарий '# получения потоковой блокировки' 'print (msg)', но код никогда не заканчивается - он просто продолжает работать. Я также попытался добавить 'msg' в список, и тот же результат. – user144153