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