2016-03-09 4 views
0

Я пытаюсь передать сообщения об ошибках в файл в моем сценарии python. У меня он работает отлично по большей части. Проблема возникает, когда я импортирую другой файл, и в этом файле есть ошибка. Вот пример (logger.py):Python stderr для импортированного класса

import time 
import sys 
import test 

class Logger(object): 
    def __init__(self,outputType): 
     self.outputType=outputType; 
     self.log = open("serverLog.log", "w") 
    def write(self, message): 
     self.log = open("serverLog.log", "a") 
     self.log.write(message) 
     self.log.close() 

sys.stdout = Logger("stdout") 
sys.stderr = Logger("stderr") 

j=0 
while 3<4: 
    print "Sdf" 
    j=j+1 
    if j>4: 
     print k 
    time.sleep(1) 

выше файл работает отлично для входа на выход и ошибки (когда test.py не импортированные).

Вот второй файл, который я ввожу (test.py) с преднамеренной ошибкой:

import time 
time.sleep(1) 
print x 

Когда я бегу logger.py, все выходные и ошибки идут в serverLog.log, за исключением для причины ошибки путем импорта test.py.

Мне интересно, можно ли передавать сообщения об ошибках с test.py на serverLog.log без добавления чего-либо к test.py.

ответ

2

Вы должны определить какие модули после: sys.stdout = Logger ("стандартный вывод") sys.stderr = Logger ("STDERR")

И результат будет: кошка serverLog.log

Traceback (most recent call last): 
    File "/root/untitled/x.py", line 16, in <module> 
    import test1 
    File "/root/untitled/test1.py", line 3, in <module> 
    print x 
NameError: name 'x' is not defined 

Мой код:

import time 
import sys 

class Logger(object): 
    def __init__(self,outputType): 
     self.outputType=outputType; 
     self.log = open("serverLog.log", "w") 
    def write(self, message): 
     self.log = open("serverLog.log", "a") 
     self.log.write(message) 
     self.log.close() 

sys.stdout = Logger("stdout") 
sys.stderr = Logger("stderr") 

import test1 

j=0 
while 3<4: 
    print "Sdf" 
    j=j+1 
    if j>4: 
     print k 
    time.sleep(1) 
1

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

import time 
<all the code in time> 
import sys 
<all the code in sys> 
import test 
import time # Now we're in test.py 
time.sleep(1) # We're still in the main thread! 
print x 

Затем интерпретатор python создает ошибку. Ни один из ваших кодов регистратора никогда не выполняется. Решение, как сказал Валерий, заключается в том, чтобы поставить код Logger перед импортом теста.

Смежные вопросы