實時獲取Python的print輸出流方法
我的應(yīng)用場景是:使用shell執(zhí)行python文件,并且通過調(diào)用的返回值獲取python的標準輸出流。
shell程序如下:
cmd='python '$1' '$2' '$3' '$5' '$4 RESULT=eval $cmd echo $RESULT
之前我的寫的python程序如下:
# coding: utf-8 import time import json def execute(_database, _parameter): print 'sleep start' sleepTime = 30 print 'sleep ' , sleepTime , 'second.' time.sleep(sleepTime) print 'sleep done' testDic={'doneCode':0,'doneMsg':'Done','logList':'success'} return json.dumps(testDic, ensure_ascii=False) if __name__ == "__main__": p = 'param' db = 'databsae' result = execute(db, p) print result
之后遇到的問題是shell不能實時的獲取python的print流,也就是說不是獲取第一條print語句之后,休眠了30秒之后才獲取最后一條print語句。
所有的print流在shell中都是一次性獲取的,這種情況對于執(zhí)行時間比較短的程序腳本沒什么影響,但是當(dāng)python程序需要執(zhí)行很長時間,而需要通過print流追蹤程序,就影響比較大。
通過查閱資料,可知:
當(dāng)我們在 Python 中打印對象調(diào)用 print obj 時候,事實上是調(diào)用了 sys.stdout.write(obj+'\n')
print 將你需要的內(nèi)容打印到了控制臺,然后追加了一個換行符
print 會調(diào)用 sys.stdout 的 write 方法
以下兩行在事實上等價:
sys.stdout.write('hello'+'\n') print 'hello'
調(diào)用sys.stdout.flush()強制其“緩沖,這意味著它會寫的一切在緩沖區(qū)到終端,即使通常會在這樣做之前等待。
改動后程序如下:
# coding: utf-8 import time import json import sys def execute(_database, _parameter): print 'time 1:',time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) print 'sleep start.' for i in range(1,10): print 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:',i print 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:',i*i print 'ccccccccccccccccccccccccccccccccccccccccccccccccccccccc:',i+i sys.stdout.flush() time.sleep(10) print 'sleep end ' print 'time 2:',time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) testDic={'doneCode':0,'doneMsg':'Done','logList':'success'} return json.dumps(testDic, ensure_ascii=False) if __name__ == "__main__": p = 'param' db = 'database' result = execute(db, p) print result
以上這篇實時獲取Python的print輸出流方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pycharm運行時總是跳出Python?Console問題
這篇文章主要介紹了Pycharm運行時總是跳出Python?Console問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04LyScript實現(xiàn)Hook改寫MessageBox的方法詳解
LyScript可實現(xiàn)自定義匯編指令的替換功能。用戶可自行編寫匯編指令,將程序中特定的通用函數(shù)進行功能改寫與轉(zhuǎn)向操作,此功能原理是簡單的Hook操作。本文將詳細介紹Hook改寫MessageBox的方法,感興趣的可以了解一下2022-09-09對python numpy數(shù)組中冒號的使用方法詳解
下面小編就為大家分享一篇對python numpy數(shù)組中冒號的使用方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04一篇文章搞懂Python程序流程控制結(jié)構(gòu)
這篇文章主要給大家介紹了關(guān)于Python程序流程控制結(jié)構(gòu)的相關(guān)資料,本節(jié)學(xué)習(xí)了Python程序的控制結(jié)構(gòu)之順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-09-09使用pandas或numpy處理數(shù)據(jù)中的空值(np.isnan()/pd.isnull())
這篇文章主要介紹了使用pandas或numpy處理數(shù)據(jù)中的空值(np.isnan()/pd.isnull()),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05詳解python使用pip安裝第三方庫(工具包)速度慢、超時、失敗的解決方案
這篇文章主要介紹了詳解python使用pip安裝第三方庫(工具包)速度慢、超時、失敗的解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Python連接MySQL數(shù)據(jù)庫的四種方法
用?Python?連接到?MySQL?數(shù)據(jù)庫的方法不是很系統(tǒng),實際中有幾種不同的連接方法,而且不是所有的方法都能與不同的操作系統(tǒng)很好地配合,本文涵蓋了四種方法,你可以用它們來連接你的Python應(yīng)用程序和MySQL,需要的朋友可以參考下2024-08-08如何利用Python和matplotlib更改縱橫坐標刻度顏色
對于圖表來說最簡單的莫過于作出一個單一函數(shù)的圖像,下面這篇文章主要給大家介紹了關(guān)于如何利用Python和matplotlib更改縱橫坐標刻度顏色的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08python包相關(guān)知識點之包的導(dǎo)入、相對路徑以及絕對路徑
Python的好處在于你不需要懂很多概念,你就有機會投入工作,同樣問題也有機會隨時發(fā)生,下面這篇文章主要給大家介紹了關(guān)于python包相關(guān)知識點之包的導(dǎo)入、相對路徑以及絕對路徑的相關(guān)資料,需要的朋友可以參考下2022-04-04