導讀
subprocess模塊是在Python2.4版本之後引入的,來調用外部命令,完成一些複雜的交互式操作
引入subprocess模塊目的是了替換下列方法或模塊的使用,並實現更高級的操作
- os.system
- os.popen
- os.popen2
- os.popen3
- os.popen4
- commands模塊
subprocess.Popen類詳解
subprocess.Popen類實例創建一個新進程,用來執行一個外部命令,Popen是subprocess模塊底層一個實現類,subprocess模塊其他調用外部命令的高級方法都是基於Popen類封裝
所以subprocess.Popen類掌握瞭解非常重要!
subprocess.Popen類構造器
subprocess模塊高級函數
subprocess模塊高級函數涉及到:
- subprocess.call()
- subprocess.check_call()
- subprocess.check_output()
- subprocess.getstatusoutput)
- subprocess.getoutput()
- subprocess.run()
subprocess.call方法
subprocess.call(args, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
說明:在Python 2.4版本引入對方法,調用外部命令,返回命令狀態碼
使用示例:
subprocess.check_call方法
subprocess.check_call(args, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
說明:在Python 2.5版本引入的方法,與call方法類似,不同在於如果命令執行成功,返回狀態碼0,否則拋出
subprocess.CalledProcessError異常
使用示例:
subprocess.check_output方法
subprocess.check_output(args, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)
說明:在Python 2.7版本引入的方法,與call方法類似,返回執行的結果,如果執行異常,則拋出
subprocess.CalledProcessError異常
使用示例:
subprocess.getstatusoutput、subprocess.getoutput方法
- subprocess.getstatusoutput(cmd) 調用外部命令,返回一個元組結構,第一個元素是命令執行狀態,第二個為執行結果
- subprocess.getoutput(cmd) 調用外部命令,返回執行的結果
subprocess.run方法,subprocess.CompletedProcess類
subprocess.run(args, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)
subprocess.run()是Python3.5中新增的一個高級函數,調用外部命令,其返回值是
subprocess.CompletedPorcess類的實例
該
subprocess.CompletedProcess類表示一個已結束進程的狀態信息
subprocess.CompletedProcess類實例屬性有:
- args: 進程支持命令,列表或字符串
- returncode: 進程的退出狀態碼
- stdout: 從子進程捕獲的stdout,其值是字節序列或字符串,當universal_newlines=True,其值為字符串
- stderr: 從子進程捕獲的stderr,其值與stdout一樣,是一個字節序列或一個字符串
- check_returncode(): 如果returncode是一個非0值,則該方法會拋出一個CalledProcessError異常
使用示例:
一些參數說明
以上高級方法,在使用上大同小異,方法參數基本一致:
- args: 要執行的命令,可以是字符串,也可以是命令及各參數組成的序列
- shell:
shell為True,args參數使用字符串
shell為True,args參數使用序列 - stdin, stdout, stderr 分別表示程序標準輸入、輸出、錯誤
- input,發送給子進程的數據,如沒有數據發送給子進程,input=None,如果universal_newlines=True,則input參數的數據類型必須是字符串
- check: check為True,進程退出狀態碼非0,則拋出CalledProcessError異常
使用建議
- subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()等調用外部命令方法都是subprocess.Popen類封裝實現
- Python2.x中的commands模塊,在Python3中被徹底被移除,commands模塊下的getoutput()和getstatusoutput()函數被遷移到subprocess模塊下,即subprocess.getoutput()和subprocess.getstatusoutput()
- Python 2.4~Python 3.5之間,保證兼容性,推薦使用subprocess.call()方法
- Python 3.5版本以上,儘量使用subprocess.run()方法
- 一些複雜操作,使用subprocess.call()、subprocess.check_call()、subprocess.check_output()和subprocess.run()沒法完成,可以使用subprocess.Popen類來完成複雜功能
最後
如果內容有誤,歡迎評論區指正!
喜歡我的朋友們,麻煩點一波關注,謝謝!