1. 程式人生 > >python執行系統命令的方法:os.system(), os.popen(), subprocess.Popen()

python執行系統命令的方法:os.system(), os.popen(), subprocess.Popen()

1、使用os.system("cmd")

這是最簡單的一種方法,其執行過程中會輸出顯示cmd命令執行的資訊。

例如:print os.system("mkdir test") >>>輸出:0

可以看到結果打印出0,表示命令執行成功;否則表示失敗(再次執行該命令,輸出:子目錄或檔案 test 已經存在。1)。

2、使用os.popen("cmd")

通過os.popen()返回的是 file read 的物件,對其進行讀取read()操作可以看到執行的輸出

例如:print os.popen("adb shell ls /sdcard/ | findstr aa.png").read() >>> 輸出:aa.png(若aa.png存在,否則輸出為空)

3、subprocess.Popen("cmd")

subprocess模組被推薦用來替換一些老的模組和函式,如:os.system、os.spawn*、os.popen*等

subprocess模組目的是啟動一個新的程序並與之通訊,最常用是定義類Popen,使用Popen可以建立程序,並與程序進行復雜的互動。其函式原型為:

class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

Popen非常強大,支援多種引數和模式,通過其建構函式可以看到支援很多引數。但Popen函式存在缺陷在於,它是一個阻塞的方法,如果執行cmd命令時產生內容非常多,函式就容易阻塞。另一點,Popen方法也不會打印出cmd的執行資訊

以下羅列常用到的引數:

args:這個引數必須是字串或者是一個由字串成員的列表。其中如果是一個字串列表的話,那第一個成員為要執行的程式的路徑以及程式名稱;從第二個成員開始到最後一個成員為執行這個程式需要輸入的引數。這與popen中是一樣的。

bufsize:一般使用比較少,略過。

executable:指定要執行的程式,這個一般很少用到,因為要指定執行的程式在args中已經指定了。stdin,stdout ,stderr:
分別代表程式的標準輸入、標準輸出、標準錯誤處理。可以選擇的值有 PIPE已經存在的開啟的檔案物件 NONE。若stdout是檔案物件的話,要確保檔案物件是處於開啟狀態。
shell:shell引數根據要執行的命令情況來定,如果將引數shell設為True,executable將指定程式使用的shell。在windows平臺下,預設的shell由COMSPEC環境變數來指定。
程式程式碼如下:程式片段1:使用檔案物件輸出執行結果
cmd = "adb shell ls /sdcard/ | findstr aa.png"
fhandle = open(r"e:\aa.txt", "w")
pipe = subprocess.Popen(cmd, shell=True, stdout=fhandle).stdout
fhandle.close()
cmd命令執行結果儲存在aa.txt檔案中
程式片段2:使用管道輸出執行結果
pipe = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout
print pipe.read()
控制檯列印輸出執行結果

參考連結: