Python 导入的标准错误 class
Python stderr for imported class
我正在尝试将错误消息传送到我的 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 添加任何内容。
您应该在以下位置之后定义任何模块:
sys.stdout = 记录器("stdout")
sys.stderr = 记录器("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)
这里的问题是我认为您认为 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 解释器然后产生错误。 None 的 Logger 代码曾经被执行过。正如 Valeriy 给出的那样,解决方案是在导入测试之前放置 Logger 代码。
我正在尝试将错误消息传送到我的 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 添加任何内容。
您应该在以下位置之后定义任何模块: sys.stdout = 记录器("stdout") sys.stderr = 记录器("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)
这里的问题是我认为您认为 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 解释器然后产生错误。 None 的 Logger 代码曾经被执行过。正如 Valeriy 给出的那样,解决方案是在导入测试之前放置 Logger 代码。