关于print()、sys.stdout、sys.stderr的一些理解
print() 方法的语法:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
其中file = sys.stdout的意思是,print函数会将内容打印输出到标准输出流(即 sys.stdout),当然也可以自定义输出流:
with open('test.log', 'a') as f:
print('hello world!', file=f)
# 内容输出到了test.log文件中,终端不会打印任何内容
也可以输出到错误输出流sys.stderr
import sys
print('hello world!', file=sys.stderr)
# 》》hello world!
其实print函数的默认输出等价于sys.stdout.write(),只是print会自动换行,而stdout需要手动添加转义符"\n"
import sys
print('hello world!')
# 》》hello world!
sys.stdout.write('hello world!\n')
# 》》hello world!
而print的输出是否被缓存通常决定于file,但如果flush参数值为True,流会被强制刷新(flush默认为false)。这里需要先看下缓冲是怎么回事
| 类型 | 说明 | 输出情况 |
|---|---|---|
| 满缓冲 | I/O操作只有在缓冲区被填满之后才会进行 | 1.缓冲区满 2.刷出数据flush 3.关闭文件 |
| 行缓冲 | 通常只有遇到换行符时,才会执行实际的I/O操作;但缓冲区满也会强制执行 | 1.遇到换行符 2.缓冲区满 3.刷出数据flush 4.关闭文件 |
| 无缓冲 | 不缓存,直接进行I/O操作 | 直接输出 |
可以在Python3官方文档中查到:When interactive, stdout and stderr streams are line-buffered. 标准输出流stdout和错误输出流stderr是行缓冲
那么当file = stdout或者file = stderr时会按照行缓冲的条件输出到终端,即需要满足以下其中一个条件才会显示打印内容:
1. 遇到换行符'\n'
2. 代码运行结束或缓冲区满
3. flush = True
现在终于可以看下摘自runoob.com的例子了,print()函数使用 flush 参数生成一个 Loading 的效果:
import time
print('---RUNOOB EXAMPLE : Loading 效果---')
print('Loading', end='')
for i in range(20):
print('.', end='', flush=True)
time.sleep(0.5)
效果如下图:
因为print使用end=' '去掉了换行,如果没有flush=True的话,程序将在最后一次性的打印出结果“Loading....................”
根据前面讲述的等效关系,又写了两种方法来实现上面的效果
第一种是通过sys.stdout.write()来实现:
import sys
import time sys.stdout.write('Loading')
for i in range(20):
sys.stdout.write('.')
sys.stdout.flush()
time.sleep(0.5)
第二种是通过sys.stderr.write()来实现,但是差别来了,其实网上随便查下stderr,会发现大多说它是无缓冲的,据说是从3.7版本之后变成的行缓冲,我用3.7.6版本执行代码是行缓冲的效果,2.7.10版本确实是无缓冲的效果了
import sys
import time sys.stderr.write('Loading')
for i in range(20):
sys.stderr.write('.')
time.sleep(0.5)
无缓冲会直接输出,便用不着sys.stdout.flush()来强制刷新了
关于print()、sys.stdout、sys.stderr的一些理解的更多相关文章
- 【python】print · sys.stdout · sys.stderr
参考文档 Python重定向标准输入.标准输出和标准错误 http://blog.csdn.net/lanbing510/article/details/8487997 python重定向sys.st ...
- PyQt(Python+Qt)学习随笔:print标准输出sys.stdout以及stderr重定向QTextBrowser等图形界面对象
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 <在Python实现print标准输出sys.stdout.st ...
- 在Python实现print标准输出sys.stdout、stderr重定向及捕获的简单办法
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 Python中的标准输出和错误输出由sys模块的stdout.stde ...
- sys.stdout sys.stderr的用法
stdout:标准输出 stderr:标准错误 print 相当于 sys.stdout.write() + 换行 一个将数据流写入文件的程序,文件名为:main.py def main(out=s ...
- python 标准输入输出sys.stdout. sys.stdin
import sys, time ## print('please enter your name:')# user_input=sys.stdin.readline()# print(user_in ...
- Python sys.stdout sys.stdin
引用自:https://www.cnblogs.com/keye/p/7859181.html 引用自:https://blog.csdn.net/sxingming/article/details/ ...
- sys.stdout 重定向
通俗的来说,sys.stdout的功能类似与C++里面的文件输出功能fprintf. 接下来直接入正题,让我们来看代码: >>> import sys >>> te ...
- python之sys.stdout、sys.stdin
转自:http://www.cnblogs.com/turtle-fly/p/3280519.html 本文环境:Python 2.7 使用 print obj 而非 print(obj) sys. ...
- python之sys.stdout、sys.stdin以及设置打印到日志文件等
转自:https://www.cnblogs.com/BigFishFly/p/6622784.html python之sys.stdout.sys.stdin 转自:http://www.cnblo ...
随机推荐
- Go Web爬虫并发实现
题目:Exercise: Web Crawler 直接参考了 https://github.com/golang/tour/blob/master/solutions/webcrawler.go 的实 ...
- Android_向用户发送短信
一段代码,用的时候copy就行 记得在manifest里声明send-sms和read-sms权限 public class SendMsgActivity extends AppCompatActi ...
- C语言 putchar
C语言 putchar putchar主要功能是输出一个char.可以根据ASLL号码输出对应字符 案例 #define _CRT_SECURE_NO_WARNINGS #include <st ...
- Spring Boot源码(四):Bean装配
为了演示Spring中对象是如何创建并放到spring容器中,这里新建一个maven项目: 其中pom.xm文件中只引入了一个依赖: <dependencies> <dependen ...
- formateDate
function formateDate(fmt, date) { let _this = new Date(date) let o = { "M+": _this.getMont ...
- DoraBox sql注入&文件上传
SQL注入 1.sqli数字型 判断是否存在注入点,执行1 and 1=1,有回显判断存在注入点 判断字段数,执行1 order by 3以及执行1 order by 4时报错,判断字段数为3 判断具 ...
- 第一个12PB的项目--2017年
今年第一个上PB级的项目终于落地.准备了几年,期盼了几年的项目,终于有了市场.内心还是有成就感的. 可是年终沟通,就像是一瓢冷水,从头往下倒.拔凉拔凉的.什么是心寒.什么是希望.想了很多. 我还本想着 ...
- 【14】Softmax回归
在下面的内容中,我们用C来表示需要分的类数. 最后一层的隐藏单元个数为4,为所分的类的数目,输出的值表示属于每个类的概率. Softmax函数的具体步骤如下图: 简单来说有三步: 计算z值(4×1矩阵 ...
- LeetCode 572. 另一个树的子树
题目链接:https://leetcode-cn.com/problems/subtree-of-another-tree/ 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和 ...
- LeetCode 112. 路径总和 (递归遍历二叉树)
题目链接:https://leetcode-cn.com/problems/path-sum/ 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 ...