簡體   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