subprocess模塊使用,輕鬆調用外部命令

導讀

subprocess模塊使用,輕鬆調用外部命令

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模塊高級函數涉及到:

  • 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模塊使用,輕鬆調用外部命令

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模塊使用,輕鬆調用外部命令

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模塊使用,輕鬆調用外部命令

subprocess.getstatusoutput、subprocess.getoutput方法

  • subprocess.getstatusoutput(cmd) 調用外部命令,返回一個元組結構,第一個元素是命令執行狀態,第二個為執行結果
  • subprocess.getoutput(cmd) 調用外部命令,返回執行的結果
subprocess模塊使用,輕鬆調用外部命令

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異常

使用示例:

subprocess模塊使用,輕鬆調用外部命令

一些參數說明

以上高級方法,在使用上大同小異,方法參數基本一致:

  • args: 要執行的命令,可以是字符串,也可以是命令及各參數組成的序列
  • shell:
    shell為True,args參數使用字符串
    shell為True,args參數使用序列
  • stdin, stdout, stderr 分別表示程序標準輸入、輸出、錯誤
  • input,發送給子進程的數據,如沒有數據發送給子進程,input=None,如果universal_newlines=True,則input參數的數據類型必須是字符串
  • check: check為True,進程退出狀態碼非0,則拋出CalledProcessError異常

使用建議

  1. subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()等調用外部命令方法都是subprocess.Popen類封裝實現
  2. Python2.x中的commands模塊,在Python3中被徹底被移除,commands模塊下的getoutput()和getstatusoutput()函數被遷移到subprocess模塊下,即subprocess.getoutput()和subprocess.getstatusoutput()
  3. Python 2.4~Python 3.5之間,保證兼容性,推薦使用subprocess.call()方法
  4. Python 3.5版本以上,儘量使用subprocess.run()方法
  5. 一些複雜操作,使用subprocess.call()、subprocess.check_call()、subprocess.check_output()和subprocess.run()沒法完成,可以使用subprocess.Popen類來完成複雜功能

最後

如果內容有誤,歡迎評論區指正!

喜歡我的朋友們,麻煩點一波關注,謝謝!


分享到:


相關文章: