subprocess.Popen()的用法

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章