python subprocess模塊 run Popen


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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

這篇文章寫的很好:https://www.cnblogs.com/yyds/p/7288916.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM