subprocess模塊源碼介紹
-
介紹
subprocess生成新的進程,連接input/output管道,並獲取返回碼.
-
常用函數 subprocess.run() 執行指定命令完成並返回一個包含執行結果的CompletedProcess類的實例。. call() 執行指定的命令,返回命令執行狀態 check_call() 執行指定的命令,如果執行成功則返回狀態碼,否則拋出異常 check_output() 執行指定的命令,如果執行狀態碼爲0則返回命令執行結果,否則拋出異常 getoutput(cmd) 接收字符串格式的命令,執行命令並返回執行結果 getstatusoutput(cmd) 執行cmd命令,返回一個元組(命令執行狀態,命令執行結果輸出) -
參數說明
- args: 執行的shell命令(字符串序列),shell參數值應該爲True.
- shell: shell爲True,指定命令通過shell執行.
- check: 爲True,且執行命令的進程以非0狀態碼退出,則會拋出一個CalledProcessError的異常.
- stdout,stderr:
- run() 函數不捕獲命令執行結果的正常和錯誤輸出.向獲取這些內容傳遞subprocess.PIPE,然後可以通過返回的CompletedProcess類實例的stdout和stderr屬性或捕獲相應的內容;
- call()和check_call()函數返回的是命令執行狀態碼.
- check_output() 返回執行命令結果.在結果中捕獲錯誤信息,可以執行stderr=subprocess.STDOUT。
- input: 該參數值是字節序列.
- universal_newlines: 影響的是輸入與輸出的數據格式.
-
subprocess.CompletedProcess類介紹
表示的是一個已結束進程的狀態信息.包含屬性如下:
- args: 加載該進程的參數.
- returncode 子進程的退出狀態碼.
- stdout: 從子進程捕獲的stdout.一個字節序列. 指定universal_newlines=True,則該屬性值是一個字符串.
- stderr: 從子進程捕獲的stderr。值是一個字節序列或一個字符串。
- check_returncode(): 如果returncode是一個非0值,則該方法會拋出一個CalledProcessError異常。.
-
示例
- run()
In [2]: subprocess.run(["ls","-l"]) -rw-r--r-- 1 liyuanjie liyuanjie 1350 12月 15 18:33 wireshark.md Out[2]: CompletedProcess(args=['ls', '-l'], returncode=0)
In [3]: subprocess.run(["ls","-l","/dev/null"],stdout=subprocess.PIPE)
Out[3]: CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'
crw-rw-rw- 1 root root 1, 3 12\xe6\x9c\x88 15 07:51 /dev/null\n')- call()
In [4]: subprocess.call(['ls','-l'])
In [5]: subprocess.call('ls -l',shell=True)In [6]: subprocess.call(['ls','-l'],stdout=subprocess.DEVNULL)
Out[6]: 0In [7]: subprocess.call(['ls','-l','/services'])
- check_call()
In [9]: subprocess.check_call(['ls','-l'])
In [10]: subprocess.check_call('ls -l',shell=True)In [11]: subprocess.check_call('ls -l /services',shell=True)
- check_output()
In [12]: ret = subprocess.check_output(['ls','-l'])
In [13]: print(ret) 返回的是字節序列.In [14]: ret = subprocess.check_output(['ls','-l'],universal_newlines=True)
In [15]: print(ret) 返回的是字符串.- getoutput()與getstatusoutput()
In [16]: ret = subprocess.getoutput('ls -l')
In [17]: print(ret)正確情況下:
In [18]: retcode,output = subprocess.getstatusoutput('ls -l')
In [19]: print(retcode)
0
In [20]: print(output)錯誤情況下:
In [21]: retcode,output = subprocess.getstatusoutput('ls -l /test')
In [22]: print(retcode)
2In [23]: print(output)
ls: cannot access '/test': No such file or directory - run()
subprocess.Popen介紹
該類用於在一個新的進程中執行一個子程序.由於subprocess模塊底層的進程創建和管理是由Popen類來處理的. 可以通過subprocess.Popen類提供的靈活的api來完成.
-
Popen的構造函數
參數說明
- args: shell命令.
- bufsize: 指定緩存策略,0表示不緩衝,1表示行緩衝.負數 表示使用系統默認緩衝策略。
- stdin,stdout,stderr: 分別表示程序標準輸入,輸出,錯誤句柄。
- preexec_fn: 用於指定一個將在子進程運行之前被調用的可執行對象.
- close_fds: 值爲True時,所有文件描述符都將在子進程執行前關閉.
- shell: 標識是否使用shell作爲要執行的程序.
- cwd: 該函數會在執行這個子進程之前改變當前工作目錄.
- env: 用於指定子進程的環境變量.
- universal_newlines爲True時,則該文件對象的stdin,stdout和stderr將會作爲文本流被打開,否則他們將會被作爲二進制流被打開。
-
Popen類的實例可調用的方法
Popen.poll() 檢查命令是否已經執行結束. wait(timeout=None) 等待子進程結束,返回狀態碼. communicate() 與進程進行交互. send_signal(signal) 發送指定的信號給這個子進程 terminate() 停止該子進程. kill() 殺死該子進程. -
示例
In [25]: p = subprocess.Popen('df -hT',stdout=subprocess.PIPE,shell=True) In [26]: print(p.stdout.read()) In [2]: p1 = subprocess.Popen(['df','-Th'],stdout=subprocess.PIPE) In [3]: p2 = subprocess.Popen(['grep','dev'],stdin=p1.stdout,stdout=subprocess.PIPE) In [4]: out,err = p2.communicate() In [5]: print(out)