日志 重定向
Python 將終端 Terminal 或者控制臺(tái)的輸出結(jié)果輸出至 log 文件 以文件形式保存
重定義 Logger 類,然后 sys.stdout = Logger(“l(fā)og文件名及路徑”)
Python 標(biāo)準(zhǔn)輸出 sys.stdout 重定向
使用 print obj 而非 print(obj)
一些背景
sys.stdout 與 print
當(dāng)我們?cè)?Python 中打印對(duì)象調(diào)用 print obj 時(shí)候,事實(shí)上是調(diào)用了 sys.stdout.write(obj+’\n’)
print 將你需要的內(nèi)容打印到了控制臺(tái),然后追加了一個(gè)換行符
print 會(huì)調(diào)用 sys.stdout 的 write 方法
以下兩行在事實(shí)上等價(jià):
sys.stdout.write(‘hello’+’\n’)
print ‘hello’
sys.stdin 與 raw_input
當(dāng)我們用 raw_input('Input promption: ') 時(shí),事實(shí)上是先把提示信息輸出,然后捕獲輸入
以下兩組在事實(shí)上等價(jià):
hi=raw_input('hello? ')
print 'hello? ', #comma to stay in the same line
hi=sys.stdin.readline()[:-1] # -1 to discard the ‘\n’ in input stream
從控制臺(tái)重定向到文件
原始的 sys.stdout 指向控制臺(tái)
如果把文件的對(duì)象的引用賦給 sys.stdout,那么 print 調(diào)用的就是文件對(duì)象的 write 方法
f_handler=open(‘out.log’, ‘w’)
sys.stdout=f_handler
print ‘hello’
this hello can’t be viewed on concole
this hello is in file out.log
記住,如果你還想在控制臺(tái)打印一些東西的話,最好先將原始的控制臺(tái)對(duì)象引用保存下來(lái),向文件中打印之后再恢復(fù) sys.stdout
復(fù)制代碼
console=sys.stdout
redirection start
…
redirection end
sys.stdout=console
復(fù)制代碼
同時(shí)重定向到控制臺(tái)和文件
如果我們希望打印的內(nèi)容一方面輸出到控制臺(tái),另一方面輸出到文件作為日志保存,那么該怎么辦?
將打印的內(nèi)容保留在內(nèi)存中,而不是一打印就將 buffer 釋放刷新,那么放到一個(gè)字符串區(qū)域中會(huì)怎樣?
a=’’
sys.stdout=a
print ‘hello’
OK,上述代碼是無(wú)法正常運(yùn)行的
Traceback (most recent call last):
File “.\hello.py”, line xx, in
print ‘hello’
AttributeError: ‘str’ object has no attribute ‘write’
錯(cuò)誤很明顯,就是上面強(qiáng)調(diào)過(guò)的,在嘗試調(diào)用 sys.stdout.write() 的時(shí)候,發(fā)現(xiàn)沒(méi)有 write 方法
另外,這里之所以提示 attribute error 而不是找不到函數(shù)等等,我猜想是因?yàn)?python 將對(duì)象/類的函數(shù)指針記錄作為對(duì)象/類的一個(gè)屬性來(lái)對(duì)待,只是保留了函數(shù)的入口地址
既然這樣,那么我們必須給重定向到的對(duì)象實(shí)現(xiàn)一個(gè) write 方法:
復(fù)制代碼
import sys
class redirection:
def __init__(self):self.buff=''self.__console__=sys.stdoutdef write(self, output_stream):self.buff+=output_streamdef to_console(self):sys.stdout=self.__console__print self.buffdef to_file(self, file_path):f=open(file_path,'w')sys.stdout=fprint self.bufff.close()def flush(self):self.buff=''def reset(self):sys.stdout=self.__console__if name==“main”:
# redirection
r_obj=redirection()
sys.stdout=r_obj
復(fù)制代碼
同樣的,sys.stderr, sys.stdin 也都可以被重定向到多個(gè)地址,舉一反三的事情就自己動(dòng)手實(shí)踐吧
總結(jié)
- 上一篇: pycharm断点调试django
- 下一篇: 史上最详细的Linux网卡ifcfg,史