繁体   English   中英

记录无法正常工作

[英]Logging isn't working properly

因此,我尝试编写一个装饰器,该装饰器将记录标准输出,同时也将其打印出来。 关键是派生输出,以便将其显示在控制台中并进行记录。 所以这就是我到目前为止:

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功能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)的调用出错了,并且由于您已将错误流重定向到temp文件,因此它将关闭而无需写任何内容,因此在控制台上什么也没有。

调试此类情况的技巧是开始剥离无法一步一步运行的代码,并将其降低到可以正常工作的最低限度。 然后再次按您的方式工作,直到开始失败。 :)

编辑

我还建议您在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'(未使用的参数)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM