python 重定向stdout_Python 犄角旮旯--重定向 stdout
What?
在 Python 程序中,使用 print 輸出調(diào)試信息的做法非常常見(jiàn),但有的時(shí)候我們需要將 print 的內(nèi)容改寫到其他位置,比如一個(gè)文件中,便于隨時(shí)排查。
但是又不希望大面積替換 print 函數(shù),這就需要一些技巧實(shí)現(xiàn)。
一種典型的做法是在代碼開(kāi)始的地方增加這樣的代碼:
def log_to_file(* args):
# write all args to some a file
pass
print = log_to_file
修改 print 方法,之后的 print 實(shí)際上就不是內(nèi)置方法了。
在 Linux 下也可以通過(guò) shell 的輸出重定向,將 print 的內(nèi)容寫入文件:
python3 your_script.py >> log.txt
其實(shí)在 Python 代碼中,也可以通過(guò)輸出重定向技術(shù),直接實(shí)現(xiàn)上面的目的。
重定向 stdout
stdout 是系統(tǒng)的標(biāo)準(zhǔn)輸出,通常是 shell 命令行。如果我們用其他對(duì)象覆蓋 sys.stdout 就可以實(shí)現(xiàn)輸出的重定向。
Python 使用任意實(shí)現(xiàn)了 write 方法的對(duì)象作為標(biāo)準(zhǔn)輸出對(duì)象。
下面定義了一個(gè) OutputWrapper:
class OutputWrapper:
def __init__(self, to_file):
self._to = to_file
def write(self, data):
# let's write to log file with some extra string.
self._to.write("-----")
self._to.write(data)
它實(shí)現(xiàn)了 write 方法,它將輸出內(nèi)容寫入 to_file, 我們?cè)俣嘧鲆稽c(diǎn)工作,在每次調(diào)用 print 前插入一段 “-----”。
下面我們用 OutputWrapper 實(shí)例替換原生 sys.stdout:
import sys
if __name__ == '__main__':
# the log file name
logname = 'log.txt'
with open(logname,'a') as logfile:
# save original stdout
original = sys.stdout
# redirect stdout
sys.stdout = OutputWrapper(logfile)
# output
print('line 1')
print('line 2')
# restore stdout
sys.stdout = original
運(yùn)行時(shí)命令行的輸出消失了,如果查看 log.txt :
-----line 1-----
-----line 2-----
原來(lái) print 的內(nèi)容已經(jīng)寫到文件中了,此時(shí) log.txt 就相當(dāng)于命令行輸出了。
為什么 “l(fā)ine1” 和 “l(fā)ine2” 后面也多了額外輸出呢?這是因?yàn)?print 方法會(huì)自動(dòng)在尾部追加輸出一個(gè) ‘\n’,又調(diào)用了一次 print(’\n’)。
How ?
這種重定向技術(shù)是如何實(shí)現(xiàn)的?其實(shí)一切就在最熟悉不過(guò)的 print 方法中。
print 方法是 Python 的內(nèi)建函數(shù),其原型為:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)第一個(gè)參數(shù)是不定參數(shù),表示 print 的對(duì)象;
sep 是多個(gè)輸出對(duì)象之間的分隔符,所以 print(‘a(chǎn)’, ‘b’) 會(huì)輸出 “a b”,這是因?yàn)?sep 默認(rèn)是空格,你也可以設(shè)置為其他字符串;
end 是行位字符,默認(rèn)是換行,這也是 print 總是一行的原因,如果不希望換行,可以用參數(shù) end = “”;
file 非常重要,表示 print 方法的輸出對(duì)象,最終的輸出工作是通過(guò) file.write 實(shí)現(xiàn)的,默認(rèn)情況下 file = sys.stdout。
flush 與輸出緩沖有關(guān),暫時(shí)不必關(guān)心。
前面的輸出重定向可以總結(jié)為這樣的流程:修改了 sys.stdout --> print 默認(rèn) file = sys.stdout --> 間接修改了 print 的輸出對(duì)象。
原來(lái)如此!Built-in Functions?docs.python.org
首發(fā)公眾號(hào) “江川Go”,關(guān)注了解程序員的燒腦日常。
總結(jié)
以上是生活随笔為你收集整理的python 重定向stdout_Python 犄角旮旯--重定向 stdout的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: not support mysql_MY
- 下一篇: beautifulsoup爬取网页中的表