python commands模塊在python3.x被subprocess取代
run: 開啟一個進程 Python 3.5中新增的函數。執行指定的命令,等待命令執行完成后返回一個包含執行結果的CompletedProcess類的實例。
call()方法能便捷的調用一個程序,並得到執行的返回碼。該方法是同步執行,需要等待命令執行完成,並且stdout不能指向PIPE,默認繼承父進程的輸出。 執行指定的命令,返回命令執行狀態,其功能類似於os.system(cmd)。
Popen:開一個管道 后台異步運行 。subprocess可以使用Popen構造,功能更強大,使用更靈活,可以做到異步調用,實時交互等。
二、subprocess基本操作方法
1. subprocess的run、call、check_call、check_output函數
- subprocess.run(args[, stdout, stderr, shell ...]):執行args命令,返回值為CompletedProcess類;
若未指定stdout,則命令執行后的結果輸出到屏幕上,函數返回值CompletedProcess中包含有args和returncode;
若指定有stdout,則命令執行后的結果輸出到stdout中,函數返回值CompletedProcess中包含有args、returncode和stdout;
若執行成功,則returncode為0;若執行失敗,則returncode為1;
若想獲取args命令執行后的輸出結果,命令為:output = subprocess.run(args, stdout=subprocess.PIPE).stdout - subprocess.call(args[, stdout, ...]):執行args命令,返回值為命令執行狀態碼;
若未指定stdout,則命令執行后的結果輸出到屏幕;
若指定stdout,則命令執行后的結果輸出到stdout;
若執行成功,則函數返回值為0;若執行失敗,則函數返回值為1;
(類似os.system) - subprocess.check_call(args[, stdout, ...]):執行args命令,返回值為命令執行狀態碼;
若未指定stdout,則命令執行后的結果輸出到屏幕;
若指定stdout,則命令執行后的結果輸出到stdout;
若執行成功,則函數返回值為0;若執行失敗,拋出異常;
(類似subprocess.run(args, check=True)) - subprocess.check_output(args[, stderr, ...]):執行args命令,返回值為命令執行的輸出結果;
若執行成功,則函數返回值為命令輸出結果;若執行失敗,則拋出異常;
(類似subprocess.run(args, check=True, stdout=subprocess.PIPE).stdout)
(1) args:啟動進程的參數,默認為字符串序列(列表或元組),也可為字符串(設為字符串時一般需將shell參數賦值為True);
(2) shell:shell為True,表示args命令通過shell執行,則可訪問shell的特性;
(3) check:check為True時,表示執行命令的進程以非0狀態碼退出時會拋出;subprocess.CalledProcessError異常;check為False時,狀態碼為非0退出時不會拋出異常;
(4) stdout、stdin、stderr:分別表示程序標准標輸出、輸入、錯誤信息;
run函數返回值為CompletedProcess類,若需獲取執行結果,可通過獲取返回值的stdout和stderr來捕獲;
check_output函數若需捕獲錯誤信息,可通過stderr=subprocess.STDOUT來獲取;
2. subprocess的getoutput、getstatusoutput函數
- subprocess.getoutput(cmd):執行cmd命令,返回值為命令執行的輸出結果(字符串類型);
注:執行失敗,不會拋出異常(類似os.popen(cmd).read()); - subprocess.getstatusoutput(cmd):執行cmd命令,返回值為元組類型(命令執行狀態, 命令執行的輸出結果);
元組中命令執行狀態為0,表示執行成功;命令執行狀態為1,表示執行失敗;
cmd:參數,字符串類型;
三、 subprocess.Popen類
1. 介紹
subprocess.Popen類用於在一個新進程中執行一個子程序,上述subprocess函數均是基於subprocess.Popen類;
2.操作
- subprocess.Popen(args[, bufsize, stdin, stdout, stderr, ...]):Popen類的構造函數,返回結果為subprocess.Popen對象;
- args:需要執行的系統命令,可為字符串序列(列表或元組,shell為默認值False即可,建議為序列),也可為字符串(使用字符串時,需將shell賦值為True);
- shell:默認為False,若args為序列時,shell=False;若args為字符串時,shell=True,表示通過shell執行命令;
- stdout、stdin、stderr:分別表示子程序標准輸出、標准輸入、標准錯誤,可為subprocess.PIPE、一個有效的文件描述符、文件對象或None。
若為subprocess.PIPE:代表打開通向標准流的管道,創建一個新的管道;
若為None:表示沒有任何重定向,子進程會繼承父進程;
stderr也可為subprocess.STDOUT:表示將子程序的標准錯誤輸出重定向到了標准輸出- bufsize:指定緩沖策略,0表示不緩沖,1表示行緩沖,其它整數表示緩沖區大小,負數表示使用系統默認值0;
- cwd:默認值為None;若非None,則表示將會在執行這個子進程之前改變當前工作目錄;
- env:用於指定子進程的環境變量。若env為None,那么子進程的環境變量將從父進程中繼承;若env非None,則表示子程序的環境變量由env值來設置,它的值必須是一個映射對象。
- universal_newlines: 不同系統的換行符不同。若True,則該文件對象的stdin,stdout和stderr將會以文本流方式打開;否則以二進制流方式打開。
(1)subprocess.Popen對象常用方法(如PopenObject為subprocess.Popen對象)
- PopenObject.poll() :用於檢查命令是否已經執行結束,若結束返回狀態碼;若未結束返回None;
- PopenObject.wait([timeout, endtime]):等待子進程結束,並返回狀態碼;若超過timeout(s)進程仍未結束,則拋出異常;
- PopenObject.send_signal(signal):發送信號signal給子進程;
- PopenObject.terminate():停止子進程;
- PopenObject.kill():殺死子進程;
- PopenObject.communicate([input, timeout]):與進程進行交互(如發送數據到stdin、讀取stdout和stderr數據),它會阻塞父進程,直到子進程完成;
input:表示將發送到子進程的字符串數據,默認為None;
timeout:超時判斷,若超過timeout秒后仍未結束則拋出TimeoutExpired異常;
communicate返回值:一個元組(stdout_data, stderr_data)
(2)subprocess.Popen對象的文本或字節流控制
- PopenObject.stdin:
若PopenObject中stdin為PIPE,則返回一個可寫流對象;若encoding或errors參數被指定或universal_newlines參數為True,則此流是一個文件流,否則為字節流。
若PopenObject中stdin不是PIPE,則屬性為None。
stdin輸入流非None,可執行寫操作即PopenObject.stdin.write(s) - PopenObject.stdout:
若PopenObject中stdout為PIPE,則返回一個可讀流對象;若encoding或errors參數被指定或universal_newlines參數為True,則此流是一個文件流,否則為字節流。
若PopenObject中stdout不是PIPE,則屬性為None。
stdout輸出流非None,可執行讀操作即PopenObject.stdout.read()或.readlines() - PopenObject.stderr:
若PopenObject中stderr為PIPE,則返回一個可讀流對象;若encoding或errors參數被指定或universal_newlines參數為True,則此流是一個文件流,否則為字節流。
若PopenObject中stderr不是PIPE,則屬性為None。
stderr錯誤流非None,可執行讀操作即PopenObject.stderr.read()或.readlines()
作者:rr1990
鏈接:https://www.jianshu.com/p/430c411160f8
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。