subprocess.Popen()的簡單用法
subprocess 模塊允許你生成新的進程,連接它們的輸入、輸出、錯誤管道,並且獲取它們的返回碼。
subprocess.Popen(args, shell=True, stderr=subprocess.PIPE, stdin=subprocess.PIPE,stdout=subprocess.PIPE)
args
被用作啓動進程的參數. 可能是一個列表或字符串.
shell
(默認爲 False)指定是否使用 shell 執行程序。如果 shell 爲 True,更推薦將 args 作爲字符串傳遞而非序列。
stdout
從子進程捕獲到的標準輸出. 一個字節序列, 或一個字符串, 如果 run() 是設置了 encoding, errors 或者 text=True 來運行的. 如果未有捕獲, 則爲 None.
如果你通過 stderr=subprocess.STDOUT 運行, 標準輸入和標準錯誤將被組合在一起, 並且 stderr` 將爲 None.
stderr
捕獲到的子進程的標準錯誤. 一個字節序列, 或者一個字符串, 如果 run() 是設置了參數 encoding, errors 或者 text=True 運行的. 如果未有捕獲, 則爲 None.
簡而言之
上面代碼簡而言之就是,接受args的命令,執行成功就將執行成功的結果存入stdout管道,執行失敗的結果存入stderr管道。
import subprocess
args1='ipconfig'
res1=subprocess.Popen(args1,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print('stdout:%s type of res:%s\n' %(res1.stdout.read().decode('gbk'),type(res1)))
args2='ssss'
res2=subprocess.Popen(args2,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print('stderr:%s type of res:%s' %(res2.stderr.read().decode('gbk'),type(res2)))
# stdout:
# Windows IP 配置
#
#
# 以太網適配器 SSTAP 1:
#
# 媒體狀態 . . . . . . . . . . . . : 媒體已斷開連接
# 連接特定的 DNS 後綴 . . . . . . . :
#
# 以太網適配器 以太網:
#
# 媒體狀態 . . . . . . . . . . . . : 媒體已斷開連接
# 連接特定的 DNS 後綴 . . . . . . . :
#
# 無線局域網適配器 本地連接* 8:
#
# 媒體狀態 . . . . . . . . . . . . : 媒體已斷開連接
# 連接特定的 DNS 後綴 . . . . . . . :
#
# 無線局域網適配器 本地連接* 10:
#
# 媒體狀態 . . . . . . . . . . . . : 媒體已斷開連接
# 連接特定的 DNS 後綴 . . . . . . . :
#
# 無線局域網適配器 本地連接* 13:
#
# 媒體狀態 . . . . . . . . . . . . : 媒體已斷開連接
# 連接特定的 DNS 後綴 . . . . . . . :
#
# 無線局域網適配器 WLAN:
#
# 連接特定的 DNS 後綴 . . . . . . . :
# 本地鏈接 IPv6 地址. . . . . . . . : fe80::f0e4:b513:4d38:8aff%8
# IPv4 地址 . . . . . . . . . . . . : 10.128.74.15
# 子網掩碼 . . . . . . . . . . . . : 255.255.128.0
# 默認網關. . . . . . . . . . . . . : 10.128.0.1
# type of res:<class 'subprocess.Popen'>
#
# stderr:'ssss' 不是內部或外部命令,也不是可運行的程序
# 或批處理文件。
# type of res:<class 'subprocess.Popen'>
該模塊還有更多功能,此功能知識其中的一小部分,主要用於返回cmd執行命令返回的結果,返回的結果是bytes字節,通過read對管道內容進行讀取,讀取的內容是bytes字節,所以需要使用decode進行解碼,windows系統編碼是gbk,linux系統是utf-8,注意二者區別。
更多功能請參考:[subprocess.Popen更多用法](https://docs.python.org/zh-cn/3/library/subprocess.html)