2022年 11月 4日

Python 命令 -u 参数作用

  • shell 脚本中运行 python 命令时后面加了 -u 参数,例如:python -u xx.py,这个 -u 表示什么?

  • 标准输出:sys.stdout.write()标准错误:sys.stderr.write() 均是向屏幕打印的语句。

    print 语句也就是调用了 sys.stdout.write()print(obj) 实质上调用的是 sys.stdout.write(obj+'\n')print 在打印时会自动加个换行符,以下两行等价:

    sys.stdout.write('hello'+'\n')
    print 'hello'
    
    • 1
    • 2
  • 举例

    import sys
    sys.stdout.write("sdo-1 ")
    sys.stderr.write("sde-1 ")
    sys.stdout.write("sdo-2 ")
    sys.stderr.write("sde-2 ")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 上面输出 预想 的结果为:sdo-1 sde-1 sdo-2 sde-2

    • 上面输出 实际 的结果为:sde-1 sde-2 sdo-1 sdo-2

    • 原因是 python 缓存机制,虽然 stderrstdout 默认都是指向屏幕的,但是 stderr 是无缓存的,程序往 stderr 输出一个字符,就会在屏幕上显示一个。

    • stdout 是有缓存的,只有遇到换行或者积累到一定的大小,才会显示出来。这就是为什么上面的会最先显示两个 stderr 的原因。

  • -u 参数的使用

    • 使用:python -u xx.py

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

    • 再次执行得到的结果:sdo-1 sde-1 sdo-2 sde-2,就变成预期结果了。

  • print 函数的 flush 参数,使用 flush=True 之后,会在 print 结束之后,不管有没有达到条件,立即将内存中的东西显示到屏幕上,清空缓存:

    print('dzm', flush=True)
    
    • 1
  • stdout.flush() 函数也有此效果:

    import sys
    sys.stdout.write('dzm')
    sys.stdout.flush()
    
    • 1
    • 2
    • 3