1. 前言
以前寫python腳本輸出日志的時候惨险,經(jīng)澄辜ⅲ看到日志文件沒有及時輸出日志。這里進行總結(jié)一下馁筐。
2.例子:
以下例子是在Python-3.7.4環(huán)境下操作
例子1:
確保當前環(huán)境變量PYTHONUNBUFFERED為空
$ export PYTHONUNBUFFERED=""
新建testoutput.py
#!/usr/bin/python
# coding=utf-8
import sys
sys.stdout.write("stdout1 ")
sys.stderr.write("stderr1 ")
sys.stdout.write("stdout2 ")
sys.stderr.write("stderr2 ")
執(zhí)行結(jié)果:
$ python3 testoutput.py
stderr1 stderr2 stdout1 stdout2
可以標準錯誤stderr
是直接輸出调限,無緩沖舟陆。 而標準輸出stdout
是行緩沖误澳,而這里沒有換行耻矮,等到緩存區(qū)滿了之后,再輸出忆谓。
例子2:
確保當前環(huán)境變量PYTHONUNBUFFERED為空
$ export PYTHONUNBUFFERED=""
新建testoutput2.py
#!/usr/bin/python
# coding=utf-8
import sys
sys.stdout.write("stdout1\n")
sys.stderr.write("stderr1\n")
sys.stdout.write("stdout2\n")
sys.stderr.write("stderr2\n")
執(zhí)行結(jié)果:
$ python3 testoutput2.py
stdout1
stderr1
stdout2
stderr2
跟例子2的區(qū)別僅僅是多加了個換行"\n"裆装,標準輸出stdout
就會及時輸出。
例子 3:
確保當前環(huán)境變量PYTHONUNBUFFERED為空
$ export PYTHONUNBUFFERED=""
新建一個first.py 文件
#!/usr/bin/python
# coding=utf-8
import subprocess
print('第1行輸出')
subprocess.run("echo 第2行輸出", shell=True, check=True)
print('第3行輸出')
結(jié)果:
$ python3 first.py
第1行輸出
第2行輸出
第3行輸出
而當我們進行重定向的時候會怎樣呢倡缠?
$ python3 first.py > result.txt
-bash-4.1$ cat result.txt
第2行輸出
第1行輸出
第3行輸出
在這里可以看出print不是及時輸出的哨免,如果重定向文件,標準輸出stdout
和標準錯誤stderr
進行緩存昙沦,等緩存區(qū)滿了以后琢唾,再整體輸出。
3.怎么及時輸出呢盾饮?
- 設(shè)置環(huán)境變量
export PYTHONUNBUFFERED=1
采桃,可以加到用戶環(huán)境變量中去。 - 執(zhí)行python腳本的時候加上參數(shù)
-u
4.啥時候需要緩存呢丘损?
主要是為了降低io操作普办,比如寫大文件,就可以進行緩存徘钥。
方法如下:
- 設(shè)置環(huán)境變量
export PYTHONUNBUFFERED=
- .執(zhí)行python腳本的時候不要加上參數(shù)
-u
5.補充下-u
參數(shù)說明:
對于3.7以上版本: 標準輸出stdout
和標準錯誤stderr
全部采用unbuffered
Changed in version 3.7: The text layer of the stdout and stderr streams now is unbuffered.