我的應用場景是:使用shell執行python文件,并且通過調用的返回值獲取python的標準輸出流。
shell程序如下:
cmd='python '$1' '$2' '$3' '$5' '$4RESULT=eval $cmdecho $RESULT
之前我的寫的python程序如下:
# coding: utf-8import timeimport jsondef 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中都是一次性獲取的,這種情況對于執行時間比較短的程序腳本沒什么影響,但是當python程序需要執行很長時間,而需要通過print流追蹤程序,就影響比較大。
通過查閱資料,可知:
當我們在 Python 中打印對象調用 print obj 時候,事實上是調用了 sys.stdout.write(obj+'/n')
print 將你需要的內容打印到了控制臺,然后追加了一個換行符
print 會調用 sys.stdout 的 write 方法
以下兩行在事實上等價:
sys.stdout.write('hello'+'/n')print 'hello'調用sys.stdout.flush()強制其“緩沖,這意味著它會寫的一切在緩沖區到終端,即使通常會在這樣做之前等待。
改動后程序如下:
# coding: utf-8import timeimport jsonimport sysdef 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輸出流方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林站長站。
新聞熱點
疑難解答