对python 命令的-u参数详解


Posted in Python onDecember 03, 2018

缘起:

今天在看arcface的训练代码,在shell脚本中运行python 命令时后面加了-u 参数(python -u xx.py),于是对这个参数进行了下小研究。

准备知识

用网上的一个程序示例来说明,python中标准错误(std.err)和标准输出(std.out)的输出规则(标准输出默认需要缓存后再输出到屏幕,而标准错误则直接打印到屏幕):

import sys
 
sys.stdout.write("stdout1")
sys.stderr.write("stderr1")
sys.stdout.write("stdout2")
sys.stderr.write("stderr2")

其中sys.stdout.write()和sys.stderr.write()均是向屏幕打印的语句。其实python中的print语句就是调用了sys.stdout.write(),例如在打印对象调用print obj 时,事实上是调用了 sys.stdout.write(obj+'\n')。

预想的结果是

stdout1stderr1stdout2stderr2

实际的结果为

stderr1stderr2stdout1stdout2

原因是python缓存机制,虽然stderr和stdout默认都是指向屏幕的,但是stderr是无缓存的,程序往stderr输出一个字符,就会在屏幕上显示一个;而stdout是有缓存的,只有遇到换行或者积累到一定的大小,才会显示出来。这就是为什么上面的会最先显示两个stderr的原因。

-u参数的使用

有了上面的铺垫,就可以引出python 的-u参数了。python命令加上-u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕。

运行结果

stdout1stderr1stdout2stderr2

这样变成了预期的输出了。

注意:以上结果是在python2下执行实现的,本人也在python3下进行了测试,python3下即便加上-u或者加上环境变量UNBUFFERED=1 运行起来stdout依旧写缓存(执行结果stderr1stderr2stdout1stdout2),具体原因没搞清,后续搞清后再来更新。

通过以上分析,不难看出尤其是在将python执行脚本输出到屏幕结果直接重定向到日志文件的情况下,使用-u参数,这样将标准输出的结果不经缓存直接输出到日志文件。

以上这篇对python 命令的-u参数详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中处理字符串的相关的len()方法的使用简介
May 19 Python
Python 多进程和数据传递的理解
Oct 09 Python
python操作列表的函数使用代码详解
Dec 28 Python
python实现旋转和水平翻转的方法
Oct 25 Python
python实现朴素贝叶斯算法
Nov 19 Python
python+logging+yaml实现日志分割
Jul 22 Python
常用python爬虫库介绍与简要说明
Jan 25 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
Python xlrd/xlwt 创建excel文件及常用操作
Sep 24 Python
详解如何修改python中字典的键和值
Sep 29 Python
python 接收处理外带的参数方法
Dec 03 #Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 #Python
浅谈python脚本设置运行参数的方法
Dec 03 #Python
Linux 修改Python命令的方法示例
Dec 03 #Python
解决Python一行输出不显示的问题
Dec 03 #Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 #Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 #Python
You might like
PHP 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
Smarty安装配置方法
2008/04/10 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
jquery等宽输出文字插件使用介绍
2013/09/18 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
2015/04/06 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
深入探究node之Transform
2017/07/20 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
django删除表重建的实现方法
2019/08/28 Python
pytorch常见的Tensor类型详解
2020/01/15 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
解决python对齐错误的方法
2020/07/16 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
《李广射虎》教学反思
2014/04/27 职场文书
俞敏洪励志演讲稿
2014/04/29 职场文书
同意转租证明
2015/06/24 职场文书
2016小学新学期寄语
2015/12/04 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
详解Java实现数据结构之并查集
2021/06/23 Java/Android
如何使用pdb进行Python调试
2021/06/30 Python
React四级菜单的实现
2022/04/08 Javascript
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL