Python 從subprocess運行的子進程中實時獲取輸出的例子
有些時候,我們需要將某些程序放到子進程中去運行,以達到整合系統(tǒng)的目的。在Python中,一個非常好的選擇就是使用subprocess模塊,本模塊為開辟子進程去執(zhí)行子程序提供了統(tǒng)一的接口,更加便于學習和使用。
同時,對于在子進程里的程序,我們希望能夠實時獲取其輸出,以在主進程中打印相關信息,使我們能夠了解當前子程序的執(zhí)行進度。對此,subprocess模塊也提供了相應的參數(shù),能夠將子程序的標準輸出和標準錯誤輸出返回給主程序。
下面,我們就通過一個例子來說明這個功能。首先,我們需要一個用于模擬標準輸出和標準錯誤輸出的“子程序”——subprogram.py:
import sys import time for i in range(5): sys.stdout.write('Processing {}\n'.format(i)) time.sleep(1) for i in range(5): sys.stderr.write('Error {}\n'.format(i)) time.sleep(1)
可以看到這個程序非常簡單,分別向標準輸出和標準錯誤寫入了5條信息,并且輸出之間有1秒的間隔。下面是驅動這個“子程序”運行的“主程序”——main.py:
import shlex import subprocess if __name__ == '__main__': shell_cmd = 'python3 subprogram.py' cmd = shlex.split(shell_cmd) p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while p.poll() is None: line = p.stdout.readline() line = line.strip() if line: print('Subprogram output: [{}]'.format(line)) if p.returncode == 0: print('Subprogram success') else: print('Subprogram failed')
可以看到,我們通過指定stderr=subprocess.STDOUT,將子程序的標準錯誤輸出重定向到了標準輸出,以使我們可以直接從標準輸出中同時獲取標準輸出和標準錯誤的信息。運行這個程序,我們會期待main.py會每秒輸出一次信息到控制臺,但是事實上,我們直到等了10秒之后才一次性看到所有的10條輸出。
產(chǎn)生這種現(xiàn)象的原因也非常簡單,就是標準輸出和標準錯誤有一個緩存的概念,它不會立即將程序的標準輸出內容返回,而是會做一定的緩存,直到緩存滿或者程序結束強制清空緩存時才輸出。了解到問題的原因,解決問題的方法也就一目了然了,我們只需要在子程序中,每次輸出后去手動清空一下緩存即可,以下是修改過的subprogram.py:
import sys import time for i in range(5): sys.stdout.write('Processing {}\n'.format(i)) sys.stdout.flush() time.sleep(1) for i in range(5): sys.stderr.write('Error {}\n'.format(i)) sys.stderr.flush() time.sleep(1)
經(jīng)過上述的修改之后,再次運行main.py程序,我們會看到,每秒會輸出一條信息,達到了我們在主程序中,去追蹤子程序執(zhí)行過程的目的。
PS:測試環(huán)境是Python3.6.1 Mac版。
以上這篇Python 從subprocess運行的子進程中實時獲取輸出的例子就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
django restframework使用redis實現(xiàn)token認證
本文主要介紹了django restframework使用redis實現(xiàn)token認證,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09python pandas 對series和dataframe的重置索引reindex方法
今天小編就為大家分享一篇python pandas 對series和dataframe的重置索引reindex方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python2.7環(huán)境Flask框架安裝簡明教程【已測試】
這篇文章主要介紹了Python2.7環(huán)境Flask框架安裝方法,結合實例形式詳細分析了Python2.7環(huán)境下安裝Flask框架遇到的問題與相關解決方法、注意事項,并給出了一個基本的測試示例,需要的朋友可以參考下2018-07-07