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

What?

在 Python 程序中,使用 print 輸出調試信息的做法非常常見,但有的時候我們需要將 print 的內容改寫到其他位置,比如一個文件中,便于隨時排查。

但是又不希望大面積替換 print 函數,這就需要一些技巧實現。

一種典型的做法是在代碼開始的地方增加這樣的代碼:

def log_to_file(* args):

# write all args to some a file

pass

print = log_to_file

修改 print 方法,之后的 print 實際上就不是內置方法了。

在 Linux 下也可以通過 shell 的輸出重定向,將 print 的內容寫入文件:

python3 your_script.py >> log.txt

其實在 Python 代碼中,也可以通過輸出重定向技術,直接實現上面的目的。

重定向 stdout

stdout 是系統的標準輸出,通常是 shell 命令行。如果我們用其他對象覆蓋 sys.stdout 就可以實現輸出的重定向。

Python 使用任意實現了 write 方法的對象作為標準輸出對象。

下面定義了一個 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)

它實現了 write 方法,它將輸出內容寫入 to_file, 我們再多做一點工作,在每次調用 print 前插入一段 “-----”。

下面我們用 OutputWrapper 實例替換原生 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

運行時命令行的輸出消失了,如果查看 log.txt :

-----line 1-----

-----line 2-----

原來 print 的內容已經寫到文件中了,此時 log.txt 就相當于命令行輸出了。

為什么 “line1” 和 “line2” 后面也多了額外輸出呢?這是因為 print 方法會自動在尾部追加輸出一個 ‘\n’,又調用了一次 print(’\n’)。

How ?

這種重定向技術是如何實現的?其實一切就在最熟悉不過的 print 方法中。

print 方法是 Python 的內建函數,其原型為:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)第一個參數是不定參數,表示 print 的對象;

sep 是多個輸出對象之間的分隔符,所以 print(‘a’, ‘b’) 會輸出 “a b”,這是因為 sep 默認是空格,你也可以設置為其他字符串;

end 是行位字符,默認是換行,這也是 print 總是一行的原因,如果不希望換行,可以用參數 end = “”;

file 非常重要,表示 print 方法的輸出對象,最終的輸出工作是通過 file.write 實現的,默認情況下 file = sys.stdout。

flush 與輸出緩沖有關,暫時不必關心。

前面的輸出重定向可以總結為這樣的流程:修改了 sys.stdout --> print 默認 file = sys.stdout --> 間接修改了 print 的輸出對象。

原來如此!Built-in Functions?docs.python.org

首發公眾號 “江川Go”,關注了解程序員的燒腦日常。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538933.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jetty實戰之 安裝 運行 部署

原文地址:http://blog.csdn.net/kongxx/article/details/7218767 1. 首先從Jetty的官方網站http://wiki.eclipse.org/Jetty/Starting/Downloads下載最新的Jetty,上面有兩個版本7.x和8.x,7.x是運行在JDK5及以上版本,8.x是運行在JD…

一行命令從 APK 文件中提取 Endpoint 及 URL

做IoT的人免不了要接觸Android,接觸Android的人又免不了要研究別人的App應用。 Diggy,一款能夠從 apk 文件中提取 endpoint 及 URL 的工具,只要一行命令就可以幫大家提取出相關Android apk文件的安裝信息和互聯網訪問信息。 下載地址&#xf…

antd 獲取table選中行數據_element-ui 組件el-table默認選中行setCurrentRow采坑記

1.背景選中表格中某一行,高亮顯示,table表格數據變化后(刪除某幾條數據,不包括選中的刪除), this.$refs.multipleTable.setCurrentRow(row),選中之前選中的行,可發現總是選中下一條的數據&#…

Unity protobuf中repeated轉C#文件List只讀問題

Unity protobuf中repeated轉C#文件List只讀問題 介紹問題解決方案總結 介紹 工具這里我就不多介紹了,如果有用到ProtoGen工具的可以繼續看一下我后面的方法。 問題 如下圖所示,我這里隨便用了一個.proto文件,看下我這里面的repeated標記的…

貪吃蛇程序 php,微信小程序-貪吃蛇教程實例

很久很久以前,差不多大半年前吧,筆者發布了一篇關于OC版貪食蛇開發的文章,時隔多月,微信小程序橫空出世,于是閑來無事的我又寫了一個小程序版下面這段話請務必閱讀筆者是做iOS的,而小程序大部分都是前端的知…

python遙感數據有償處理_利用python讀寫tiff遙感影像數據

from osgeo import gdal# 讀圖像文件def read_img(filename):dataset gdal.Open(filename) # 打開文件im_width dataset.RasterXSize # 柵格矩陣的列數im_height dataset.RasterYSize # 柵格矩陣的行數im_geotrans dataset.GetGeoTransform() # 仿射矩陣im_proj dataset.G…

Tomcat啟動時自動加載Servlet

轉自:http://zhaoyongpan.blog.51cto.com/2714930/676239 想實現這樣的功能: 1. Tomcat啟動時隨即啟動Servlet; 2. Servlet啟動時定時執行一個任務。 要點: 1、Tomcat中啟動Servlet時,只需要在Servlet所在的工程的配置文件web…

internal java compiler error_Java異常處理總結

背景 最近專門負責團隊的項目質量。我在治理異常日志過程中,總結了一下Java的異常處理。上面是我整理的最近自己比較常見的異常知識地圖。異常知識地圖概述 從異常知識地圖最左邊的根開始看,地圖從左到右的連線連接的類之間有實實在在的父…

java異步刷新集合,同步和異步集合的性能測試,異步集合性能測試,package cn.o

同步和異步集合的性能測試,異步集合性能測試,package cn.opackage cn.outofmemory.snippets.core;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Vector;import java.util.concurrent.TimeUnit;public class Co…

cuda nvcc版本不一致_windows 驗證CUDA和CUDNN是否安裝成功

安裝完成CUDA,使用 nvcc -V 驗證是否安裝成功,看到如下信息說明安裝成功接下來就可以安裝 cuDNN 了。安裝cuDNN下載 cuDNN,下載之前需要先注冊一下 Nvidia 的賬號,下載地址為:https://developer.nvidia.com/rdp/cudnn-…

Nova Cell

Nova Cell V2 詳解 現在 ,OpenStack 在控制平面上的性能瓶頸主要在 Message Queue 和 Database 。 尤其是 Message Queue , 隨著計算節點的增加 , 性能變的越來越差 。 為了應對這種情況 , Nova 很早之前提出來 nova-cell ( 以下以 cellv1 代…

Android 通過WIFI狀態監聽廣播,判斷進入指定wifi范圍

原文地址:http://blog.csdn.net/kongxiuqi/article/details/52524500 --------------------------------------------- WIFI狀態變化會發送廣播,一些可用的廣播在WifiManger.java中可以看到。 廣播一:WIFI 狀態開關變化的監聽,en…

2018年度最佳網頁設計與開發教程

任何一個網站從開發到最終上線, 都是需要團隊協作且謹慎的一個過程,而實際中往往會遇到各類問題,所以網頁設計師通常需要扮演多種角色,除了掌握必備的網頁設計技能外,更應該對后期的開發流程及內容有所了解&#xff0c…

mysql_ping()函數的作用以及返回值的類型正確的是,[單選] mysql_ping()函數的作用以及返回值的類型正確的是:()...

[單選] mysql_ping()函數的作用以及返回值的類型正確的是:()更多相關問題中華田園犬,雄性,2歲,昨晚外出未歸,今晨發現患犬精神沉郁,呼吸急促,體溫39℃,左胸側壁中下部有創1884年新疆…

java 截取byte數組_2020年的秋招已經開始了!最新Java面試題大全(文末附參考答案)送給大家...

包含的模塊本文分為十九個模塊,分別是:Java 基礎、容器、多線程、反射、對象拷貝、Java Web 、異常、網絡、設計模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM共包含 208 道面…

MVP模式在Android項目中的使用

煩了在Activity中編寫太多的代碼,該app由我來主導。就選擇用MVP模式。 概述 MVP是模型(Model)、視圖(View)、主持人(Presenter)的縮寫,分別代表項目中3個不同的模塊。 模型&#…

運行時錯誤7內存溢出_C++程序運行時的內存模型

C程序在運行時會將內存劃分為4個區域:1代碼區:存放函數體的二進制代碼,由操作系統進行管理2全局區:存放程序的全局變量、靜態變量、常量3棧區:由編譯器進行自動分配和釋放,存放函數的參數值,局部…

php strip_tags 少,詳解PHP函數 strip_tags的用法不足之處

這篇文章主要介紹了詳解PHP函數 strip_tags 處理字符串缺陷bug的相關資料,需要的朋友可以參考下詳解PHP函數 strip_tags 處理字符串缺陷bugPHP 函數 strip_tags() 是一個常用函數,該函數可以剝去字符串中的 HTML、XML 以及 PHP 的標簽。極大方便了對字符串的操作&am…

玩轉Android之MVVM開發模式實戰,炫酷的DataBinding!

原文:http://blog.csdn.net/u012702547/article/details/52077515 --------------------------------------------------------- MVP可以結合android的DataBinding -------------------------以下轉載--------------- C# 很早就有了MVVM的開發模式,An…

打造一款便攜版的Sublime Text

https://segmentfault.com/a/1190000000707661 https://www.cnblogs.com/52cik/p/sublime-diy.html 直接安裝Sublime Text,不要打開 大家可以參照上文提到的《Sublime Text 全程指引》中的步驟去進行安裝。我這里使用的是Sublime Text 2,其實3也是一樣的…