首页 > 编程语言 >【Python】关于print()、sys.stdout、sys.stderr的一些理解

【Python】关于print()、sys.stdout、sys.stderr的一些理解

时间:2022-12-21 14:56:53浏览次数:83  
标签:stdout Python 缓冲 sys stderr flush print

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()来强制刷新了

参考资料:
[【Python】关于print()、sys.stdout、sys.stderr的一些理解](https://www.cnblogs.com/oyster25/p/12348148.html)

标签:stdout,Python,缓冲,sys,stderr,flush,print
From: https://www.cnblogs.com/ttyangY77/p/16996257.html

相关文章

  • Systemverilog实现参数化的Round-Robin Arbiter Tree
    SystemVerilog#arbiter#round-robin本篇内容涉及的rtl代码为开源组织PLUP的commoncell仓库中的源代码,本文只是对其进行些许解读。源码链接如下:[https://github.com/pu......
  • python-网络爬虫-爬取股票数据预测分析
    一、课题研究背景与意义有人把数据比喻为蕴藏能量的煤矿。煤炭按照性质有焦煤、无烟煤、肥煤、贫煤等分类,而露天煤矿、深山煤矿的挖掘成本又不一样。与此类似,大数据并不在......
  • Electron Mac 打包报 Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT 解决
     Electron项目使用vue-cli-electron-builder创建,原来我的Mac上编译都很正常自从Mac升级到macOSventuraversion13.0.1后打包报错,electron-builder编译dmg......
  • python 文件读写
    1.1文件夹与文件路径d:\python\1.py路径是:d:\python文件是:1.py1.1.1绝对路径与相对路径绝对路径:从根目录开始的路径相对路径:从当前工作目录开始的路径相对路......
  • Go/Python 基于gRPC传输图片
    python程序作为服务端,Go程序作为客户端,基于gPRC进行通信客户端定义proto文件:syntax="proto3";optiongo_package=".;transfer";serviceGreeter{rpcSendI......
  • Could not load file or assembly 'System.Drawing.Common, Version=5.0.0.0, Culture
    今天做了头像的更新上传,功能调试的好好的,但是发布到线上就提示找不到文件,奇了怪了,发布目录的System.Drawing.Common.dll文件我也拷贝上去了,runtimes文件下的unix和win也有......
  • web自动化selenium+python
      对于每一条selenium脚本,一个http请求会被创建并且发送给浏览器的驱动,浏览器驱动中包含了一个httpserver。用来接收这些请求,httpserver接收到请求后根据请求来具体......
  • Python中利用exec批量生成变量
    转载自:https://blog.csdn.net/qq_41710383/article/details/115758160exec和eval的区别函数概括eval():函数用来执行一个字符串表达式,并返回表达式的值。注意:计算指......
  • Python-实现斐波那契数列
    代码实现如下:#-*-coding:utf-8-*-#定义函数deffab(n):#判断n的有效性ifn<=0:return'传递的参数必须是大于0的正整数!'#当n为1时......
  • python编程实战案例--turtle图案绘制
    1.turtle库基本介绍(1)turtle(海龟库):是python的标准库之一,是python绘图体系的实现具体实现:海龟(画笔)处于画面正中央,当海龟落下,行走的所形成的的轨迹,就是我们所绘制的图案2.turt......