python模組--subprocess

來源:互聯網
上載者:User

標籤:建立   包含   shel   user   plain   結束   try   arm   標準輸入   

subprocess模組                                                                                                                                      

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

    該模組擁有多個方法,具體如下:

  • subprocess.call()
    直接列印系統命令的執行結果,如果執行成功,返回狀態代碼為0,否則為1,例如:

#執行成功import subprocessCALL1 = 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=128127.0.0.1 的 Ping 統計資訊:    資料包: 已發送 = 1,已接收 = 1,丟失 = 0 (0% 丟失),往返行程的估計時間(以毫秒為單位):    最短 = 0ms,最長 = 0ms,平均 = 0msReturncode: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=128127.0.0.1 的 Ping 統計資訊:    資料包: 已發送 = 1,已接收 = 1,丟失 = 0 (0% 丟失),往返行程的估計時間(以毫秒為單位):    最短 = 0ms,最長 = 0ms,平均 = 0ms


  • subprocess.Popen()

    上面幾個函數都是Popen()的封裝,主進程都會等待子進程執行完畢,Popen()建立的子進程不會被等待,相當於非同步執行。

    1.Popen()建立的對象有多個方法,可以針對子進程執行個人化操作,例如:

import subprocessimport timetime.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.stdinPOPEN1.stdoutPOPEN1.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.stdoutprint(str(STDOUT3.read(),'gbk'))

執行結果為:

資料包: 已發送 = 1,已接收 = 1,丟失 = 0 (0% 丟失),



python模組--subprocess

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.