python模塊--subprocess

subprocess模塊                                                                                                                                      
python

    subprocess模塊用於幫助咱們在python代碼中去執行一些系統命令,在執行python程序時,該模塊會建立出一個子進程,來運行外部程序。
shell

    該模塊擁有多個方法,具體以下:
緩存

  • subprocess.call()
    直接打印系統命令的執行結果,若是執行成功,返回狀態碼爲0,不然爲1,例如:異步

#執行成功
import subprocess
CALL1 = subprocess.call('ping 127.0.0.1 -n 1',shell=True)
print("Returncode:%d"%CALL1)

打印結果爲:
ide

正在 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錯誤,例如:spa

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)

打印結果爲:code

正在 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% 丟失),
相關文章
相關標籤/搜索