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.mzph.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也是一样的…