gpt4 book ai didi

python - 日志记录无法正常工作

转载 作者:行者123 更新时间:2023-12-01 05:02:46 24 4
gpt4 key购买 nike

所以我试图编写一个装饰器来记录标准输出,同时也打印它。重点是 fork 输出,以便它将显示在控制台中并被记录。这就是我到目前为止所拥有的:

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__

这个功能似乎工作正常。

最佳答案

为什么使用 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: Unused argument 'arg' (unused-argument)

这清楚地表明出现了问题。

关于python - 日志记录无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25709263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com