標籤:
作用:建立附加進程,並與之通訊。如果一個程式需要生產或利用文本,這個模組尤其有協助,因為這個API支援通過新進程的標準輸入和輸出通道來回傳遞資料。
subprocess模組提供了一種一致的方法來建立和處理附加進程。與標準庫中的其他模組相比,它提供了一個更進階的介面,用以替換os.system()、os.spawnv()、os和popen2模組中的popen()函數,以及commands()。
subprocess模組定義了一個類Popen,還定義了使用這個類的一些封裝器函數。Popen的建構函式根據一些參數建立新進程,使父進程可以通過管道與之通訊。相對於它替換的其他模組和函數,subprocess能提供其全部功能,甚至更多。對於所有情況,這個API用法都一致,很多需要開銷的額外步驟(如關閉額外的檔案描述符,以及確保管道關閉)都已“內建”,而不需要由應用代碼單獨處理。
要運行一個外部命令,但不採用os.system()的方式與之互動,可以使用call()函數。命令列參數作為一個字串列表傳入,這樣就無須對引號或者其他可能由shell解釋的特殊字元轉義。
1 >>> import subprocess2 >>> subprocess.call([‘ls‘,‘-l‘])3 data4 test.py5 06 >>>
將shell參數設定為true值會使subprocess建立一個中間shell進程,由這個進程運行命令。預設情況下會直接運行命令。
>>> import subprocess>>> subprocess.call(‘ls -l‘,shell=True)總用量 52drwxr-xr-x 2 root root 4096 8月 9 22:29 data-rw-r--r-- 1 root root 469 8月 7 22:52 test.py0>>>
call()的傳回值是程式的退出碼。調用者要負責解釋這個傳回值來檢測錯誤。check_call()函數的工作類似於call(),只不過除了檢查退出碼外,如果指示發生了一個錯誤,則會產生一個CalledProcesssError異常。
1 >>> import subprocess2 >>> try:3 ... subprocess.check_call([‘false‘])4 ... except subprocess.CalledProcessError as err:5 ... print ‘ERROR:‘,err6 ... 7 ERROR: Command ‘[‘false‘]‘ returned non-zero exit status 18 >>>
對於call()啟動的進程,其標準輸入和輸出通道會綁定到父進程的輸入和輸出。這說明調用程式無法捕獲命令的輸出。可以使用check_output()捕獲輸出,以備以後處理。ls -l命令會成功運行,所以它列印到標準輸出到文本會被捕獲並返回。
1 >>> import subprocess 2 >>> output = subprocess.check_output([‘ls‘,‘-l‘]) 3 >>> print ‘Have %d bytes in output‘ % len(output) 4 Have 822 bytes in output 5 >>> print output 6 總用量 56 7 drwxr-xr-x 2 root root 4096 8月 9 22:29 data 8 -rw-r--r-- 1 root root 469 8月 7 22:52 test.py 9 10 >>>
下一個例子在一個子shell中運行一系列命令。在命令返回一個錯誤碼並退出之前,訊息會發送到標準輸出和標準錯誤輸出。發送到標準錯誤輸出的訊息會列印到控制台,不過發送到標準輸出的訊息會隱藏。
1 >>> import subprocess 2 >>> try: 3 ... output = subprocess.check_output( 4 ... ‘echo to stdout; echo to stderr 1>&2; exit 1‘, 5 ... shell=True,
#stderr=subprocess.STDOUT 6 ... ) 7 ... except subprocess.CalledProcessError as err: 8 ... print ‘ERROR:‘,err 9 ... else:10 ... print ‘Have %d bytes in output‘ % len(output)11 ... print output12 ... 13 to stderr #將check_output()中的stderr參數設定為常量STDOUT時,這句不會被輸出。14 ERROR: Command ‘echo to stdout; echo to stderr 1>&2; exit 1‘ returned non-zero exit status 115 >>>
《python標準庫》--subprocess <一、運行外部命令>