py文件输出结果_Python-写了1行日志,业务处理完毕为啥没有输出日志

本文探讨了Python脚本中日志输出的缓冲问题,解释了为何日志可能不会立即显示。通过示例展示了环境变量PYTHONUNBUFFERED对输出的影响,以及如何通过设置该变量或使用-u参数实现日志的实时打印。了解这些知识有助于优化Python脚本的日志处理,尤其是在需要即时反馈的场景中。
摘要由CSDN通过智能技术生成

1. 前言

你有没有试过Python脚本输出日志的时候,看到日志文件没有及时输出日志。为什么会这样,今天跟大家分享下。

912d915d04fd34e934311fc7d266be40.png

Question

2.实际测试

以下例子是在Python-3.7.4环境下操作,请注意。

例子1:

确保当前环境变量PYTHONUNBUFFERED为空

$ export PYTHONUNBUFFERED=""

新建一个testoutput.py

#!/usr/bin/python# coding=utf-8import syssys.stdout.write("stdout1 ")sys.stderr.write("stderr1 ")sys.stdout.write("stdout2 ")sys.stderr.write("stderr2 ")

执行结果:

$ python3 testoutput.py stderr1 stderr2 stdout1 stdout2
16af3cdaf7d19a13efd7ab7935b2e799.png

可以看到标准错误stderr是直接输出,无缓冲。

而标准输出stdout意思是行缓冲,而这里没有换行,等到缓存区满了之后,再输出。

例子2:

确保当前环境变量PYTHONUNBUFFERED为空

$ export PYTHONUNBUFFERED=""

新建testoutput2.py

#!/usr/bin/python# coding=utf-8import syssys.stdout.write("stdout1")sys.stderr.write("stderr1")sys.stdout.write("stdout2")sys.stderr.write("stderr2")

执行结果:

$ python3 testoutput2.py stdout1stderr1stdout2stderr2
5102d1da1d8a080ddb71472068ce48eb.png

跟例子2的区别仅仅是多加了个换行"",标准输出stdout就会及时输出

例子 3:

确保当前环境变量PYTHONUNBUFFERED为空

$ export PYTHONUNBUFFERED=""

新建一个third.py 文件

#!/usr/bin/python# coding=utf-8import subprocessprint('第1行输出')subprocess.run("echo 第2行输出", shell=True, check=True)print('第3行输出')

结果:

$ python3 third.py第1行输出第2行输出第3行输出
b22f8929e05ce7bd72d36e19689d1757.png

而当我们进行重定向的时候会怎样呢?

$ python3 third.py > result.txt-bash-4.1$ cat result.txt 第2行输出第1行输出第3行输出
8f7e6205119f8abb5821c8e930a9f505.png

在这里可以看出print不是及时输出的,如果重定向文件,标准输出stdout和标准错误stderr进行缓存,等缓存区满了以后,再整体输出。

3.怎么及时输出呢?

  1. 设置环境变量 export PYTHONUNBUFFERED=1,可以加到用户环境变量中去。
  2. 执行python脚本的时候加上参数-u

4.啥时候需要缓存呢?

主要是为了降低io操作,比如写大文件,就可以进行缓存。

方法如下:

  • 设置环境变量为空
export PYTHONUNBUFFERED=
  • 执行python脚本的时候不要加上参数-u

5.补充下-u参数说明:

对于3.7以上版本: 标准输出stdout和标准错误stderr全部采用unbuffered(无缓存)。

Changed in version 3.7: The text layer of the stdout and stderr streams now is un

6.结束语

学会了吗?真棒。


喜欢本文的童鞋,可以关注我+收藏。

3fddeb2a113e9c72547aab7a5a17a173.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值