所以我正在尝试编写一个装饰器来记录标准输出,同时打印它。重点是分叉输出,使其显示在控制台中,并记录。所以这就是我到目前为止所做的:
from time import time
import tempfile
import sys
import datetime
def printUsingTempFile(f):
def wrapper(*a, **ka):
with open('sysLog.txt', 'a') as logFile:
with tempfile.NamedTemporaryFile() as f:
sys.stdout = f
sys.stderr = f
retVal = f(*a, **ka)
f.flush(); f.seek(0); logFile.write('\n'.join(f.readlines()))
f.flush(); f.seek(0); sys.__stdout__.write('\n'.join(f.readlines()))
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
return retVal
return wrapper
if __name__ == '__main__':
@printUsingTempFile
def someFunc(abc='Hello!!!'):
'''
This is the docstring of the someFunc function.
'''
print abc
return 1
someFunc('Print something here')
我这样运行:
In [18]: !python utility.py
因为如果我使用run
函数运行,则会关闭愚蠢的iPython窗口。
我在目录中收到一个名为'sysLog.txt'
的新文件,但该文件为空。而且无处可见。没有任何错误或任何错误。根本不值一提!这里有点沮丧。不确定如何调试此代码:(
编辑:
我意识到我没有寻求两次,所以我更新了代码。我尝试了以下代码:
def printUsingTempFile1():
with open('sysLog.txt', 'a') as logFile:
with tempfile.NamedTemporaryFile() as f:
sys.stdout = f
sys.stderr = f
print 'This is something ...'
f.flush(); f.seek(0); logFile.write('\n'.join(f.readlines()))
f.flush(); f.seek(0); sys.__stdout__.write('\n'.join(f.readlines()))
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
这个功能似乎正常。
答案 0 :(得分:2)
为什么使用f
作为传递函数的名称以及临时文件的名称?我假设调用f(*a, **ka)
错误,因为您已将错误流重定向到临时文件,它会在没有写出任何内容的情况下关闭,因此控制台上没有任何内容。
调试这些情况的一个技巧是开始剥离不能逐个工作的代码片段,并将其降低到可行的最低限度。然后再继续努力直到它开始失败。 :)
修改强>
我还建议您在lint工具下运行代码以捕获这些问题。对于例如下面张贴的代码:
''' This is a test module '''
import tempfile
import sys
def print_tmp_file(arg):
''' Print out the things using temp file '''
def wrapper(*a, **ka):
''' Wrapper function '''
with open('sysLog.txt', 'a') as log_file:
with tempfile.NamedTemporaryFile() as arg:
sys.stdout = arg
sys.stderr = arg
ret_val = arg(*a, **ka)
arg.flush()
arg.seek(0)
log_file.write('\n'.join(arg.readlines()))
arg.flush()
arg.seek(0)
sys.__stdout__.write('\n'.join(arg.readlines()))
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
return ret_val
return wrapper
if __name__ == '__main__':
@print_tmp_file
def some_func(abc='Hello!!!'):
''' This is the docstring of the someFunc function. '''
print abc
return 1
some_func('Print something here')
在上面的代码上运行pylint
会发出以下警告:
W:6,19:未使用的参数'arg'(unused-argument)
这清楚地表明出现了问题。