參考地址:https://www.cnblogs.com/wrxblog/p/9752412.html
https://www.cnblogs.com/hei-hei-hei/p/7216434.html
http://www.cnblogs.com/yangykaifa/p/7127776.html
一、使用os模塊:
os.system()
os.system("The command you want").
這個調用相當直接,且是同步進行的,程序需要阻塞並等待返回。執行后返回的是程序執行的狀態0或者1
os.popen(command[,mode[,bufsize]])
popen方法可以得到shell命令的返回值。os.popen(cmd)后,須要再調用read()或者readlines()這兩個命令,輸出結果。
通過 os.popen() 返回的是 file read 的對象,對其進行讀取 read() 的操作可以看到執行的輸出。但是無法讀取程序執行的返回值)
os.popen() #返回的是 file read 的對象,但沒有狀態碼 a=os.popen("df -hT | awk 'NR==3{print $(NF-1)}'").read() #返回的是字符串; a=os.popen("df -hT | awk 'NR==3{print $(NF-1)}'").readlines() #返回的是列表.
a=os.popen("ls","r").read()
a.close() #popen需要關閉close().當執行成功時,close()不返回任何值,失敗時,close()返回系統返回值
二、使用commands模塊(commands適用於Python2)
使用commands模塊的getoutput方法,這種方法同popend的區別在於popen返回的是一個文件句柄,而本方法將外部程序的輸出結果當作字符串返回,很多情況下用起來要更方便些。
主要方法:
commands.getstatusoutput(cmd) 返回(status, output)
commands.getoutput(cmd) 只返回輸出結果
commands.getstatus(file) 返回ls -ld file的執行結果字符串,調用了getoutput,不建議使用此方法
commands.getstatusoutput('ls /bin/ls') #返回(status和output)如(0, '/bin/ls') commands.getoutput('ls /bin/ls') # 返回命令的輸出結果 commands.getstatus('log') # 調用commands.getoutput中的命令對'log'文件進行相同的操作
commands模塊有三個方法可供選擇。getstatusoutput, getoutput, getstatus。
但是,如上三個方法都不是Python推薦的方法,而且在Python3中其中兩個已經消失。Python文檔中目前全力推薦第四個方法,subprocess!
三、subprocess適用於Python3
根據Python官方文檔說明,subprocess模塊用於取代上面這些模塊。
subprocess與system相比的優勢是它更靈活(你可以得到標准輸出,標准錯誤,“真正”的狀態代碼,更好的錯誤處理,等..)
subprocess.call(["some_command","some_argument","another_argument_or_path"])
subprocess.call(command,shell=True)
subprocess.Popen(command,shell=True)
假設command不是一個可運行文件。shell=True不可省,shell=True意思是shell下運行command。。
使用subprocess模塊能夠創建新的進程,能夠與新建進程的輸入/輸出/錯誤管道連通。並能夠獲得新建進程運行的返回狀態。使用subprocess模塊的目的是替代os.system()、os.popen*()、commands.*等舊的函數或模塊。
call--執行命令,返回狀態碼(命令正常執行返回0,報錯則返回1);
check_call
-
-
執行命令,如果執行成功則返回狀態碼
0
,否則拋異常;
check_output
-
-
執行命令,如果執行成功則返回執行結果,否則拋異常;
Popen
-
-
用於執行復雜的系統命令,
subprocess.call(["ls","-l"],shell=Ture) #執行成功后,返回狀態碼0或者1
subprocess.output(["echo","helloworld"]) #返回程序執行的返回結果
