天天看點

python執行系統指令的方法

    做為系統工程師來說,經常會用到python腳本去調用一下系統指令,現把經常使用的集中調用方法總結如下:

一,os.system(command)

在一個子shell中運作command指令,并傳回command指令執行完畢後的退出狀态。這個函數執行指令的結果無法儲存,隻能顯示在标準輸出。但是,指令執行是否成功的退出狀态可以通過變量得到,非0即為不正常。

例:

>>> os.system('ls /tmp')

hsperfdata_root  supervisor.sock  tmp_fifo

>>> code=os.system('ls /tmp')

>>> print code

二,os.popen(command[, mode[, bufsize]])

打開一個與command程序之間的管道,函數的傳回值是一個連接配接到管道的檔案對象,故可以對檔案做讀寫操作(由mode決定rw,mode預設是’r',)。bufsize指定了檔案期望的buffer大小,0意味着不是用buffer,1意味着line buffered(行緩沖),負值意味着使用系統預設行為,正值意味着按設定的num值開辟buffer空間;一般終端相關的裝置輸出用行緩沖,對檔案相關輸出用全緩沖;預設情況下,buffer是全緩沖,加快了檔案讀取速度減少了上下文切換。如果mode為’r',可以使用此函數的傳回值調用read()來擷取command指令的執行結果。

>>> f=os.popen('ls /tmp')            

>>> f.readlines()

['hsperfdata_root\n', 'supervisor.sock\n', 'tmp_fifo\n']

三,subprocess

第一種:

subprocess.call(["some_command","some_argument","another_argument_or_path"])

與os.system的功能相同。

第二種:

subprocess.Popen(command,shell=True)

已子程序的方式去執行指令,然後傳回代表新程序的Popen對象。他可以與建立程序的輸入/輸出/錯誤管道聯通,并可以獲得建立程序執行的傳回狀态等。使用subprocess子產品主要目的就是來替代之前的os,popen,commands等函數或子產品。

執行基本的系統指令,直接輸出結果

>>> ret = subprocess.call('ls /tmp',shell=True)

執行系統指令,但是捕捉輸出

>>> f = subprocess.Popen('ls /tmp',shell=True,stdout=subprocess.PIPE)

>>> print f.stdout.readlines()

建立2個子程序,通過管道把他們連接配接起來。一個程序的輸出作為另一個程序的輸入

>>> f = subprocess.Popen('ls -l',shell=True,stdout=subprocess.PIPE)

>>> p = subprocess.Popen('wc', shell=True, stdin=f.stdout, stdout=subprocess.PIPE) 

>>> print p.stdout.readlines()

['     73     652    4161\n']

四,commands

commands子產品用于執行以字元串形式指定的簡單系統指令,并将其輸出以字元串形式傳回,僅使用于unix系統。

getoutput(cmd)

在shell中執行cmd,傳回包含指令标準輸出和标準錯誤流的字元串。

getstatusoutput(cmd)

與getoutput類似,差别在于傳回的是二進制組(status,output)

>>> out=commands.getoutput('ls /tmp') 

>>> print out

hsperfdata_root

supervisor.sock

tmp_fifo

>>> status,out=commands.getstatusoutput('ls /tmp') 

>>> print status,out

0 hsperfdata_root

本文轉自 leejia1989 51CTO部落格,原文連結:http://blog.51cto.com/leejia/1439031,如需轉載請自行聯系原作者