1. 程式人生 > 程式設計 >Python中Subprocess的不同函式解析

Python中Subprocess的不同函式解析

以前我一直用os.system()處理一些系統管理任務,因為我認為那是執行linux命令最簡單的方式.
我們能從Python官方文件裡讀到應該用subprocess 模組來執行系統命令.subprocess模組允許我們建立子程序,連線他們的輸入/輸出/錯誤管道,還有獲得返回值。
subprocess模組打算來替代幾個過時的模組和函式,比如: os.system,os.spawn*,os.popen*,popen2.*命令。
讓我們來看一下subprocess 有哪些不同的函式.

subprocess.call()

執行由引數提供的命令.

我們可以用陣列作為引數執行命令,也可以用字串作為引數執行命令(通過設定引數shell=True)

注意,引數shell預設為False

我們用subprocess.call()來做一個統計磁碟的例子:

subprocess.call(['df','-h'])

下面的例子把shell設定為True

subprocess.call('du -hs $HOME',shell=True)

注意,python官方文件裡對引數shell=True陳述了一個警告:

Invoking the system shell with shell=True can be a security hazard if combined
with untrusted input

現在,我們來看看輸入與輸出

Input and Output

subprocess 模組能阻止輸出,當你不關心標準輸出的時候是非常方便的.

它也使你通過一種正確的方式管理輸入/輸出,有條理地整合python指令碼中的的shell命令.

Return Codes

通過subprocess.call的返回值你能夠判定命令是否執行成功.
每一個程序退出時都會返回一個狀態碼,你可以根據這個狀態碼寫一些程式碼。

stdin,stdout and stderr

在使用subprocess 時,有一個微妙的部分是怎麼使用管道把命令連線起來.

管道表明一個新的子管道應該被建立.

預設的設定為None,意味著沒有重定向發生

標準錯誤可以指向標準輸出,表明子程序的錯誤資訊會被捕獲到和標準輸出同一個檔案.

subprocess.Popen()

subprocess 模組中基本的程序建立和管理由Popen 類來處理.

subprocess.popen是用來替代os.popen的.

我們來做一些真實的例子,subprocess.Popen需要一個數組作為引數:

import subprocess
p = subprocess.Popen(["echo","hello world"],stdout=subprocess.PIPE)
print p.communicate()
>>>('hello world
',None)

注意,雖然你可以使用 "shell=True",但並不推薦這樣的方式.

如果你知道你只用幾個有限的函式,比如Popen和PIPE,你可以單單指定這幾個函式:

from subprocess import Popen,PIPE
p1 = Popen(["dmesg"],stdout=PIPE)
print p1.communicate()

Popen.communicate()

communicate()函式返回一個tuple(標準輸出和錯誤).

Popen.communicate() 和程序溝通:傳送資料到標準輸入.從標準輸出和錯誤讀取資料直到遇到結束符.等待程序結束.

輸入引數應該是一個字串,以傳遞給子程序,如果沒有資料的話應該是None.

基本上,當你用 communicate()函式的時候意味著你要執行命令了.

用subprocess寫Ping程式

我們先問使用者地址,然後用ping請求這個地址.

# Import the module
import subprocess

# Ask the user for input
host = raw_input("Enter a host to ping: ")  

# Set up the echo command and direct the output to a pipe
p1 = subprocess.Popen(['ping','-c 2',host],stdout=subprocess.PIPE)

# Run the command
output = p1.communicate()[0]

print output

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。