我正在測試一段使用subprocess.call()的Python代碼,所以我無法控制該函數調用。我需要捕獲來自該系統調用的輸出來做斷言。我嘗試將os.stdout設置爲一個StringIO對象,但它不捕獲系統調用輸出。我該如何解決這個問題?這裏是我到目前爲止的代碼:捕獲subprocess.call的輸出,我無法控制
代碼來測試(我有過這個沒有控制):
def runFile(filename):
check_call("./" + filename)
我試圖捕捉系統調用的輸出:
import StringIO
oldout = sys.stdout
try:
sys.stdout = StringIO.StringIO()
runFile("somefile")
output = sys.stdout.getvalue()
assert output == "expected-output"
finally:
sys.stdout = oldout
我確實喜歡這種方法,但是有沒有辦法讓當前進程不阻塞,如果有很多輸出? – Addison
如果你不能把函數調用改成'check_call()',那麼不會。如果你可以改變它,你可以給它一個'stdout = subprocess.PIPE'並且在另一個線程中輪詢'stdout',或者你可以用'Popen','stdout.read'替代'check_call() ()'和'wait()'。但如果你不能改變,這是唯一的選擇(除了補丁子進程)。 – glglgl