python調用shell方法總結


參考地址: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"])   #返回程序執行的返回結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM