在shell指令碼中執行python 命令時後面加了-u 引數(python -u xx.py),這個-u表示什麼?
importsys
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(unbuffered)引數後會強制其標準輸出也同標準錯誤一樣不通過快取直接列印到螢幕。
執行結果:stdout1stderr1stdout2stderr2
注意:以上結果是在python2下執行實現的,本人也在python3下進行了測試,python3下即便加上-u或者加上環境變數unbuffered=1 執行起來stdout依舊寫快取(執行結果stderr1stderr2stdout1stdout2),具體原因沒搞清,後續搞清後再來更新。
通過以上分析,不難看出尤其是在將python執行指令碼輸出到螢幕結果直接重定向到日誌檔案的情況下,使用-u引數,這樣將標準輸出的結果不經快取直接輸出到日誌檔案。
python 郵件解析 解析python傳送郵件
獲取郵件伺服器 email host smtp.163.com send user 163.com password x123456 定義傳送郵件主體 def send mail self,user list,sub,content user message mimetext content,sub...
python命令列解析 python解析命令列
可以解析這樣的命令 cron ctrl jobname1 stop cron ctrl jobname1 start cron ctrl jobname1 list usr bin env python importosimportsysfrom optparse importoptionparse...
python切片解析
切片原型 strs abcdefg strs start end step 切片的三個引數分別表開始,結束,步長 第一位下標為0 end 位不取,如 strs 1 3 bc 如果start end 超出現有陣列範圍,按實際範圍截斷 strs 100 100 abcdefg step為空時,預設值為 ...