Python的sys.stdout、sys.stdin重定向

Python的sys.stdout、sys.stdin重定向

转自:http://www.cnblogs.com/turtle-fly/p/3280519.html

本文环境:Python 2.7 

使用 print obj 而非 print(obj)

一些背景

sys.stdout 与 print

当我们在 Python 中打印对象调用 print obj 时候,事实上是调用了 sys.stdout.write(obj+'\n')

print 将你需要的内容打印到了控制台,然后追加了一个换行符

print 会调用 sys.stdout 的 write 方法

以下两行在事实上等价:

sys.stdout.write('hello'+'\n') 

print 'hello'

sys.stdin 与 raw_input

当我们用 raw_input('Input promption: ') 时,事实上是先把提示信息输出,然后捕获输入

以下两组在事实上等价:

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

从控制台重定向到文件

原始的 sys.stdout 指向控制台

如果把文件的对象的引用赋给 sys.stdout,那么 print 调用的就是文件对象的 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

记住,如果你还想在控制台打印一些东西的话,最好先将原始的控制台对象引用保存下来,向文件中打印之后再恢复 sys.stdout

__console__=sys.stdout 

# redirection start # 

... 

# redirection end 

sys.stdout=__console__

同时重定向到控制台和文件

如果我们希望打印的内容一方面输出到控制台,另一方面输出到文件作为日志保存,那么该怎么办?

将打印的内容保留在内存中,而不是一打印就将 buffer 释放刷新,那么放到一个字符串区域中会怎样?

a='' 

sys.stdout=a 

print 'hello'

OK,上述代码是无法正常运行的

Traceback (most recent call last): File 

".\hello.py", line xx, in print 'hello' 

AttributeError: 'str' 

object has no attribute 'write'

错误很明显,就是上面强调过的,在尝试调用 sys.stdout.write() 的时候,发现没有 write 方法

另外,这里之所以提示 attribute error 而不是找不到函数等等,我猜想是因为 python 将对象/类的函数指针记录作为对象/类的一个属性来对待,只是保留了函数的入口地址

既然这样,那么我们必须给重定向到的对象实现一个 write 方法:

import sys 

class __redirection__: 

def __init__(self): 

self.buff='' 

self.__console__=sys.stdout 

def write(self, output_stream): 

self.buff+=output_stream 

def to_console(self): 

sys.stdout=self.__console__ 

print self.buff 

def to_file(self, file_path):

f=open(file_path,'w') 

sys.stdout=f 

print self.buff 

f.close() 

def flush(self): 

self.buff='' 

def reset(self): 

sys.stdout=self.__console__ 

if __name__=="__main__": 

# redirection 

r_obj=__redirection__() 

sys.stdout=r_obj

# get output stream 

print 'hello' 

print 'there' 

# redirect to console 

r_obj.to_console() 

# redirect to file 

r_obj.to_file('out.log') 

# flush buffer

r_obj.flush() 

# reset 

r_obj.reset()

同样的,sys.stderr, sys.stdin 也都可以被重定向到多个地址,举一反三的事情就自己动手实践吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10+Ubuntu16.04/Ubuntu18.04双系统安装教程

最近因为开发需要安装Linux系统,因为安装好几次Ubuntu18.04失败,退而安装Ubuntu16.04 安装也失败好几次,在不断尝试下终于解决,后来思考一下觉得Ubuntu 16.04/18.04安装失败原因一致,先进行分享。 先把我遇到的问题给大家看看如下…

获取XML的文件信息

1 /**2 * 获取XML文件的信息3 */4 import java.io.IOException;5 import javax.xml.parsers.DocumentBuilder;6 import javax.xml.parsers.DocumentBuilderFactory;7 import javax.xml.parsers.ParserConfigurationException;8 import org.w3c.dom.Document;9 import org.w3c…

python 中的三元表达式(三目运算符)

python中的三目运算符不像其他语言 其他的一般都是 判定条件?为真时的结果:为假时的结果 如 result5>3?1:0 这个输出1,但没有什么意义,仅仅是一个例子。 而在python中的格式为 为真时的结果 if 判定条件 else 为假时的结果 还是上面的例子 1 if 5…

Linux 命令简单介绍第一课笔记

第一: 相对路径和绝对路径 相对路径:从当前路径开始进入blog文件夹 cd blog绝对路径:从跟目录开始进入blog文件夹 cd /home/yq/Desktop/blog 全称:根目录下home文件下的yq文件下的Desktop文件下的blog文件夹cd ./blog:进入当前…

我是如何转行 AI 并且实现薪资翻倍的

大家好啊,我是董董灿。 熟悉我的小伙伴都知道,我之前在北京某211大学,本硕读了7年的机械专业,后来硕士毕业后,果断转行去做了嵌入式开发,随后瞅准了 AI 爆发的时机果断转行去做了AI。 这段经历已经过去了…

16_1

从16年开始向前,就变得简单了 一、问题 一,给定一个数n,将这个数的各位顺序颠倒,称为逆序数m。 例如1234的逆序数是4321 如果m是n的整数倍,那么输出n*km,例如: 输入: 1089 输出&…

免费网络研讨会:调试生产中Java的新方法

什么是最有用的Java生产调试技术? 您永远不知道将新代码部署到生产中时会发生什么。 曾经很好的工作代码可能会变成有问题的应用程序,无法按预期工作。 这就是为什么在生产中进行调试是了解应用程序在现实生活中的行为而不是您如何思考其行为的关键要素。…

你必须了解的session的本质

有一点我们必须承认,大多数web应用程序都离不开session的使用。这篇文章将会结合PHP以及http协议来分析如何建立一个安全的会话管理机制。我们先简单的了解一些http的知识,从而理解该协议的无状态特性。然后,学习一些关于cookie的基本操作。最…

Linux 命令简单介绍第二课笔记

第一:touch touch 1.txt 创建文件第二:ls ls 用来查看当前文件中的内容,其中加上不同参数-a,-h,-l可以有不同的显示,同事也可以将一个具体内容从定向到一个TXT文件中:具体如下 第三:grep搜索 grep:文本搜索…

人工智能实战_第一次作业_杨佳宁_16141032

项目内容这个作业属于哪个课程班级博客这个作业的要求在哪里作业要求我在这个课程的目标是对于人工智能有一定的了解这个作业在哪个具体方面帮助我实现目标能够有平台支持我对于人工智能更加深入的了解与交流作业正文见下其他参考文献无具体作业1、描述你在这门课想要达到的具体…

Linux压缩和解压缩命令汇总(tar命令汇总)

linux 中压缩文件非常常见,以下为本人对Linux压缩和解压缩命令进行了简单汇总,具体如下: 第一:打包解包 打包命令(注意打包文件大小并没有压缩) tar -cvf xxx.tar 要打包的文件解包命令 tar -xvf xxx.…

MFC程序打开控制台

转自:http://blog.csdn.NET/acaiacc/article/details/5543669 利用AllocConsole() 在你的MFC程序中添加这些代码,可以获得控制台的输入,你试试 AllocConsole(); freopen("CONOUT$","wt",stdout); freopen("…

jmeter异步请求测试_使用JMeter对异步HTTP / REST服务进行压力/负载测试

jmeter异步请求测试尽管我一直在使用JMeter进行Web应用程序的压力测试和负载测试好几次,但我们还是花了一些时间才弄清楚如何使用该工具测试基于异步HTTP / REST的服务。 对我们来说,我是一个程序员的同伴– Holger Staudacher ,我很荣幸能与…

Linux 中vim编辑器学习笔记

vim是Linux是非常常用的编辑器,也是编程开发中的神器之一。接下来,是我学习vim编辑器的一些笔记,总结如下: 首先:我们接触的vim编辑器一共有三种模式,分别为命令模式、编辑模式、末行模式。 具体架构如下 …

Python 面向对象(初级篇)

概述面向过程:根据业务逻辑从上到下写垒代码函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可面向对象:对函数进行分类和封装,让开发“更快更好更强...”面向过程编程最易被初学者接受&…

利用IDA Pro反汇编程序

IDA Pro是一款强大的反汇编软件,特有的IDA视图和交叉引用,可以方便理解程序逻辑和快速定位代码片断,以方便修改。 IDA视图 示例程序 下面会通过修改示例程序的输出字符串,来讲解如何使用IDA Pro。 #includemain() {int n;scanf (…

Neo4j:找到两个纬度/经度之间的中间点

昨天我写了一篇博客文章,展示了如何使用Cypher查找两个纬度/经度之间的中点,这是第一次尝试填补丢失位置的方法,但我意识到我可以做得更好。 正如我在上一篇文章中提到的,当我找到一个缺少经纬度坐标的停靠点时,通常可…

Linux系统更新最新版R语言方法

Linux系统更新最新版R语言方法 第一:卸载之前的版本 sudo apt remove r-base-core第二:在 /etc/apt/sources中添加源 sudo vi /etc/apt/sources对于不同系统添加不同的源具体如下: #(19.04) deb https://cloud.r-project.org/bin/linux/…

Kali Linux下安装VMware

1.Kali Linux安装VMware Workstation 10.0 首先去官网下载VMware Workstation 10.0;下载地址: https://my.vmware.com/web/vmware/details?downloadGroupWKST-1006-LX&productId362&rPId8483 然后cd到下载目录,输入: su…

3月12号

上午复习了昨天的内容,学习了有序列表、无序列表、自定义列表、特殊字符标签. 下午学习了表格、表单、文本域、html新增标签、input新增的type属性值、多媒体标签、多媒体video. 这些知识都比较简单,我在来学校上课之前就已经非常熟悉了...... 最后发一张…