您好,登錄后才能下訂單哦!
subprocess模塊
subprocess模塊用于幫助我們在python代碼中去執行一些系統命令,在執行python程序時,該模塊會創建出一個子進程,來運行外部程序。
該模塊擁有多個方法,具體如下:
subprocess.call()
直接打印系統命令的執行結果,如果執行成功,返回狀態碼為0,否則為1,例如:
#執行成功 import subprocess CALL1 = subprocess.call('ping 127.0.0.1 -n 1',shell=True) print("Returncode:%d"%CALL1)
打印結果為:
正在 Ping 127.0.0.1 具有 32 字節的數據: 來自 127.0.0.1 的回復: 字節=32 時間<1ms TTL=128 127.0.0.1 的 Ping 統計信息: 數據包: 已發送 = 1,已接收 = 1,丟失 = 0 (0% 丟失), 往返行程的估計時間(以毫秒為單位): 最短 = 0ms,最長 = 0ms,平均 = 0ms Returncode:0
#執行失敗 CALL2 = subprocess.call('ping 1.1.1.2 -n 1',shell=True) print("Returncode:%d"%CALL2)
打印結果為:
正在 Ping 1.1.1.2 具有 32 字節的數據: 請求超時。 1.1.1.2 的 Ping 統計信息: 數據包: 已發送 = 1,已接收 = 0,丟失 = 1 (100% 丟失), Returncode:1
subprocess.check_call()
直接打印系統命令的執行結果,使用方法與subprocess.call()相同,只不過該函數會檢測返回狀態碼,如果為1,則會拋出subprocess.CalledProcessError錯誤,例如:
import subprocess # 執行成功 # CHECK_CALL1 = subprocess.check_call('ping 127.0.0.1 -n 1',shell=True) # print(CHECK_CALL1) # 執行失敗 CHECK_CALL2 = subprocess.check_call('ping 1.1.1.2 -n 1',shell=True) print(CHECK_CALL2)
打印結果為:
正在 Ping 1.1.1.2 具有 32 字節的數據: 請求超時。 1.1.1.2 的 Ping 統計信息: 數據包: 已發送 = 1,已接收 = 0,丟失 = 1 (100% 丟失), Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/first/subprocess/check_call.py", line 7, in <module> CHECK_CALL2 = subprocess.check_call('ping 1.1.1.2 -n 1',shell=True) File "C:\Python3.6\lib\subprocess.py", line 291, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command 'ping 1.1.1.2 -n 1' returned non-zero exit status 1.
可以結合try...expect...語句做異常處理。
subprocess.check_output()
不會將系統命令的執行結果直接打印出來,返回一個bytes類型的對象,該對象包含了系統命令的執行結果,如果執行失敗會拋出subprocess.CalledProcessError錯誤,例如:
import subprocess #執行成功 CHECK_OUTPUT1 = subprocess.check_output('ping 127.0.0.1 -n 1',shell=True) print(type(CHECK_OUTPUT1)) print(str(CHECK_OUTPUT1,'gbk'))
打印結果為:
<class 'bytes'> 正在 Ping 127.0.0.1 具有 32 字節的數據: 來自 127.0.0.1 的回復: 字節=32 時間<1ms TTL=128 127.0.0.1 的 Ping 統計信息: 數據包: 已發送 = 1,已接收 = 1,丟失 = 0 (0% 丟失), 往返行程的估計時間(以毫秒為單位): 最短 = 0ms,最長 = 0ms,平均 = 0ms
subprocess.Popen()
上面幾個函數都是Popen()的封裝,主進程都會等待子進程執行完畢,Popen()創建的子進程不會被等待,相當于異步執行。
1.Popen()創建的對象有多個方法,可以針對子進程執行個性化操作,例如:
import subprocess import time time.clock() POPEN1 = subprocess.Popen('ping 127.0.0.1 -n 10',shell=True) print(POPEN1) print(time.clock())
打印結果為:
<subprocess.Popen object at 0x02230810> 0.06108553745727746 #從時間上看,主程序很快就結束了
Popen()創建的對象方法包括:
POPEN1.poll() # 檢查子進程狀態 POPEN1.kill() # 終止子進程 POPEN1.terminate() # 終止子進程 POPEN1.send_signal() # 向子進程發送信號 pid屬性包含了子進程的pid號
2.subprocess.Popen()另一個常用的功能是文本流控制,對應的"標準輸入"、"標準輸出"、"標準錯誤"分別是:
POPEN1.stdin POPEN1.stdout POPEN1.stderr
subprocess.PIPE(為文本流提供一個緩存區)作為管道,可以用來連接標準輸出和標準輸入,例如:
POPEN2 = subprocess.Popen('ping 127.0.0.1 -n 1',shell=True,stdout=subprocess.PIPE) STDOUT2 = POPEN2.stdout # print(str(STDOUT2.read(),'gbk')) POPEN3 = subprocess.Popen('findstr 數據包',shell=True,stdin=STDOUT2,stdout=subprocess.PIPE) STDOUT3 = POPEN3.stdout print(str(STDOUT3.read(),'gbk'))
執行結果為:
數據包: 已發送 = 1,已接收 = 1,丟失 = 0 (0% 丟失),
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。