005在python程序中調(diào)用shell命令

在python程序中調(diào)用shell命令

1. os.system(command)

此函數(shù)會(huì)啟動(dòng)子進(jìn)程,在子進(jìn)程中執(zhí)行command,并返回command命令執(zhí)行完畢后的退出狀態(tài),如果command有執(zhí)行內(nèi)容,會(huì)在標(biāo)準(zhǔn)輸出顯示。這實(shí)際上是使用C標(biāo)準(zhǔn)庫(kù)函數(shù)system()實(shí)現(xiàn)的。

缺點(diǎn):這個(gè)函數(shù)在執(zhí)行command命令時(shí)需要重新打開一個(gè)終端,并且無(wú)法保存command命令的執(zhí)行結(jié)果。
system方法會(huì)創(chuàng)建子進(jìn)程運(yùn)行外部程序,方法只返回外部程序的運(yùn)行結(jié)果。這個(gè)方法比較適用于外部程序沒有輸出結(jié)果的情況。

import os 
 os.system("echo \"Hello World\"")  # 直接使用os.system調(diào)用一個(gè)echo命令 
 Hello World     ——————> 打印命令結(jié)果 
0          ——————> What's this ? 返回值? 
>>> val = os.system("ls -al | grep \"log\" ")  # 使用val接收返回值 
-rw-r--r-- 1 root    root    6030829 Dec 31 15:14 log  ——————> 此時(shí)只打印了命令結(jié)果 
>>> print val       
0          ——————> 注意,此時(shí)命令正常運(yùn)行時(shí),返回值是0
>>> val = os.system("ls -al | grep \"log1\" ") 
>>> print val     
256         ——————> 使用os.system調(diào)用一個(gè)沒有返回結(jié)果的命令,返回值為256~ 

實(shí)例:os.system(‘ls -l *’)

2. os.popen(command,mode)

打開一個(gè)與command進(jìn)程之間的管道。這個(gè)函數(shù)的返回值是一個(gè)文件對(duì)象,可以讀或者寫(由mode決定,mode默認(rèn)是’r’)。如果mode為’r’,可以使用此函數(shù)的返回值調(diào)用read()來(lái)獲取command命令的執(zhí)行結(jié)果。

os.system(cmd)或os.popen(cmd),前者返回值是腳本的退出狀態(tài)碼,后者的返回值是腳本執(zhí)行過程中的輸出內(nèi)容。實(shí)際使用時(shí)視需求情況而選擇。

  • 當(dāng)需要得到外部程序的輸出結(jié)果時(shí),本方法非常有用,返回一個(gè)類文件對(duì)象,調(diào)用該對(duì)象的read()或readlines()方法可以讀取輸出內(nèi)容。比如使用urllib調(diào)用Web API時(shí),需要對(duì)得到的數(shù)據(jù)進(jìn)行處理。os.popen(cmd) 要得到命令的輸出內(nèi)容,只需再調(diào)用下read()或readlines()等 如a=os.popen(cmd).read()
>>> os.popen('ls -lt')         # 調(diào)用os.popen(cmd)并不能得到我們想要的結(jié)果 
<open file 'ls -lt ', mode 'r' at 0xb7585ee8> 
>>> print os.popen('ls -lt').read()   # 調(diào)用read()方法可以得到命令的結(jié)果 
total 6064
-rwxr-xr-x 1 long    long      23 Jan 5 21:00 hello.sh 
-rw-r--r-- 1 long    long      147 Jan 5 20:26 Makefile 
drwxr-xr-x 3 long    long     4096 Jan 2 19:37 test 
-rw-r--r-- 1 root    root    6030829 Dec 31 15:14 log 
drwxr-xr-x 2 long    long     4096 Dec 28 09:36 pip_build_long 
drwx------ 2 Debian-gdm Debian-gdm  4096 Dec 23 19:08 pulse-gylJ5EL24GU9 
drwx------ 2 long    long     4096 Jan 1 1970 orbit-long
>>> val = os.popen('ls -lt').read()   # 使用變量可以接收命令返回值 
>>> if "log" in val:          # 我們可以使用in來(lái)判斷返回值中有木有一個(gè)字符串 
...   print "Haha,there is the log"
... else: 
...   print "No,not happy"
... 
Haha,there is the log 

實(shí)例:tmp = os.popen(‘ls -l *’).readlines()

3. commands.getstatusoutput(command)

使用os.popen()函數(shù)執(zhí)行command命令并返回一個(gè)元組(status,output),分別表示command命令執(zhí)行的返回狀態(tài)和執(zhí)行結(jié)果。對(duì)command的執(zhí)行實(shí)際上是按照{(diào)command;} 2>&1的方式,所以output中包含控制臺(tái)輸出信息或者錯(cuò)誤信息。output中不包含尾部的換行符。
使用commands模塊的getoutput方法,這種方法同popend的區(qū)別在于popen返回的是一個(gè)類文件對(duì)象,而本方法將外部程序的輸出結(jié)果當(dāng)作字符串返回,很多情況下用起來(lái)要更方便些。

4. subprocess模塊

根據(jù)Python官方文檔說(shuō)明,subprocess模塊用于取代上面這些模塊。有一個(gè)用Python實(shí)現(xiàn)的并行ssh工具—mssh,代碼很簡(jiǎn)短,不過很有意思,它在線程中調(diào)用subprocess啟動(dòng)子進(jìn)程來(lái)干活。

 args="ls -l"
 p=subprocess.Popen(args,shell=True)

subprocess與system相比的優(yōu)勢(shì)是它更靈活(你可以得到標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤,“真正”的狀態(tài)代碼,更好的錯(cuò)誤處理,等…)。其中的call()完全替代了system(),而popen()被更為豐富的Popen類替代;

總結(jié):推薦使用subprocess.run() 來(lái)解決一般問題。

subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()都是通過對(duì)subprocess.Popen的封裝來(lái)實(shí)現(xiàn)的高級(jí)函數(shù),因此如果我們需要更復(fù)雜功能時(shí),可以通過subprocess.Popen來(lái)完成。run默認(rèn)不會(huì)返回輸出,只返回命令和執(zhí)行狀態(tài)。
Python之系統(tǒng)交互(subprocess)
舉例講解Linux系統(tǒng)下Python調(diào)用系統(tǒng)Shell的方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 利用Python調(diào)用外部系統(tǒng)命令的方法可以提高編碼效率。調(diào)用外部系統(tǒng)命令完成后可以通過獲取命令執(zhí)行返回結(jié)果碼、執(zhí)行...
    A遇上方知友閱讀 649評(píng)論 0 0
  • (1) os.system 這個(gè)方法是直接調(diào)用標(biāo)準(zhǔn)C的system() 函數(shù),僅僅在一個(gè)子終端運(yùn)行系統(tǒng)命令,而...
    堅(jiān)持未來(lái)閱讀 1,668評(píng)論 0 2
  • 沉默,是一種氣度,是非對(duì)錯(cuò),時(shí)間會(huì)給予最真實(shí)的檢驗(yàn)。被人誤解了,沉默是一種善良,情感的厚薄時(shí)間會(huì)給最好的證明。被...
    散鹽良雨閱讀 145評(píng)論 0 1
  • 尊敬的總會(huì)顧問委員會(huì)薛德山主任、尊敬的總會(huì)顧問薛柏清宗長(zhǎng)、各位領(lǐng)導(dǎo)、各位宗親、各位朋友:大家好! 臘月伊始,新舊之...
    薛崔愿閱讀 649評(píng)論 4 3
  • 看到今天的主題,想起了精讀營(yíng)十天看的《說(shuō)話的魅力》。說(shuō)話是一門藝術(shù),話多不好,顯的過于浮躁,但太過沉默,少有溝通也...
    起點(diǎn)_7ae7閱讀 141評(píng)論 0 0

友情鏈接更多精彩內(nèi)容