做為系統工程師來說,經常會用到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,如需轉載請自行聯系原作者