有時候難免需要直接調用Shell命令來完成一些比較簡單的操作,比如mount一個文件系統之類的。那么我們使用Python如何調用Linux的Shell命令?下面來介紹幾種常用的方法:
1. os 模塊
1.1. os模塊的exec方法族
Python的exec系統方法同Unix的exec系統調用是一致的。這些方法適用于在子進程中調用外部程序的情況,因為外部程序會替換當前進程的代碼,不會返回。( 這個看了點 help(os) --> search "exec" 的相關介紹,但是沒太搞明白咋使用)
1.2. os模塊的system方法
system方法會創建子進程運行外部程序,方法只返回外部程序的運行結果。這個方法比較適用于外部程序沒有輸出結果的情況。
>>> import os >>> os.system("echo /"Hello World/"") # 直接使用os.system調用一個echo命令 Hello World ——————> 打印命令結果 0 ——————> What's this ? 返回值? >>> val = os.system("ls -al | grep /"log/" ") # 使用val接收返回值 -rw-r--r-- 1 root root 6030829 Dec 31 15:14 log ——————> 此時只打印了命令結果 >>> print val 0 ——————> 注意,此時命令正常運行時,返回值是0 >>> val = os.system("ls -al | grep /"log1/" ") >>> print val 256 ——————> 使用os.system調用一個沒有返回結果的命令,返回值為256~ >>>
注意:上面說了,此方法脂肪會外部程序的結果,也就是os.system的結果,所以如果你想接收命令的返回值,接著向下看~
1.3. os模塊的popen方法
當需要得到外部程序的輸出結果時,本方法非常有用。比如使用urllib調用Web API時,需要對得到的數據進行處理。os.popen(cmd) 要得到命令的輸出內容,只需再調用下read()或readlines()等 如a=os.popen(cmd).read()
>>> os.popen('ls -lt') # 調用os.popen(cmd)并不能得到我們想要的結果 <open file 'ls -lt ', mode 'r' at 0xb7585ee8> >>> print os.popen('ls -lt').read() # 調用read()方法可以得到命令的結果 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來判斷返回值中有木有一個字符串 ... print "Haha,there is the log" ... else: ... print "No,not happy" ... Haha,there is the log
2. commands 模塊
使用commands模塊的getoutput方法,這種方法同popend的區別在于popen返回的是一個文件句柄,而本方法將外部程序的輸出結果當作字符串返回,很多情況下用起來要更方便些。
新聞熱點
疑難解答