日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python 重定向stdout_Python 犄角旮旯--重定向 stdout

發(fā)布時(shí)間:2025/3/11 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 重定向stdout_Python 犄角旮旯--重定向 stdout 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。