我正在尝试将错误消息传递给我的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添加任何内容。
答案 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代码。