用于导入类的Python stderr

时间:2016-03-09 05:17:41

标签: python stdout stderr

我正在尝试将错误消息传递给我的python脚本中的文件。我在大多数情况下工作得很好。导入另一个文件时出现问题,该文件中存在错误。这是一个例子(logger.py):

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 个答案:

答案 0 :(得分:2)

您应该在以下后面定义任何模块: sys.stdout = Logger(“stdout”) sys.stderr = Logger(“stderr”)

结果将是: cat 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 :(得分:1)

这里的问题是我认为你认为import会创建一个新线程。以下是正在执行的代码行:

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代码都没有被执行。正如Valeriy所给出的,解决方案是在导入测试之前输入Logger代码。