對比subprocess.call啟動進程,使用subprocess.Popen能提供細粒度控制。 啟動一個子進程: process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg']) Popen的簽名和和call函數(shù)類似;然而,Popen將會立即返回,而不像call那樣等待子進程完成后返回。 等待子進程完成: process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg']) process.wait() 從子進程中讀取輸出 process = subprocess.Popen([r'C:\path\to\app.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 這將阻塞進程直到完成 stdout, stderr = process.communicate() print stdout print stderr 在子進程執(zhí)行過程中進行交互 你甚至可以在進程未完成的時對stdin和stdout進行讀寫操作。這個功能在其他程序自動化操作的場景中很有用。 對子線程的寫操作 process = subprocess.Popen([r'C:\path\to\app.exe'], stdout = subprocess.PIPE, stdin = subprocess.PIPE) process.stdin.write('line of input\n') line = process.stdout.readline() 然而,如果你你僅僅需要的是一組輸入和輸出,而不是動態(tài)交互,你應該使用communicate()而不是直接訪問stdin和stdout。 從子進程中讀取流 當你想逐行讀取子線程的輸出時,你可以使用下面的代碼片段: process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE) while process.poll() is None: output_line = process.stdout.readline() 當自命令的輸出不包含EOL字符的情況下,上面的片段將不會如逾期一樣工作。在這種情況下,你可以從輸出中按照字符諸葛讀取,如下: process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE) while process.poll() is None: output_line = process.stdout.read(1) 1作為讀取方法的參數(shù),使讀取操作每次讀取一個字符。你可以讀取任意長度的字符。負數(shù)或者0則使read方法一直讀取,直到遇到EOF。在上面的這些代碼片段中,在子線程未完成之前process.poll()的值是None。這在沒有更多輸出需要讀取時判斷是否需要退出循環(huán)很有用。同樣也適用于子進程的錯誤輸出。
|
|
來自: 啟辰ozkb3yjim4 > 《待分類》