1.os.system('cmd')
os.system('cat /proc/cpuinfo')
直接執(zhí)行參數(shù)中傳入的命令攀例,無法獲取輸出和返回值。
2.os.popen('cmd')
output=os.popen('cat /proc/cpuinfo')
print(output.read())
通過 os.popen() 返回的是 file read 的對象丹禀,對其進行讀取 read() 的操作可以看到執(zhí)行的輸出。
3.commands.getstatusoutput('cmd')
(status,output)=commands.getstatusoutput('cat /proc/cpuinfo')
printstatus,output
一個方法就可以獲得到返回值和輸出鞋怀。
PS:commands引用的時候需要加入import commands(可能不支持報No module named Commands)双泪。
subprocess子模塊:
摘自:www.jb51.net/article/48086.htm
從Python 2.4開始,Python引入subprocess模塊來管理子進程密似,以取代一些舊模塊的方法:如 os.system攒读、os.spawn*、os.popen*辛友、popen2.*、commands.*不但可以調(diào)用外部的命令作為子進程剪返,而且可以連接到子進程的input/output/error管道废累,獲取相關(guān)的返回信息。
subprocess包中定義有數(shù)個創(chuàng)建子進程的函數(shù)脱盲,這些函數(shù)分別以不同的方式創(chuàng)建子進程邑滨,所以我們可以根據(jù)需要來從中選取一個使用。另外subprocess還提供了一些管理標準流(standard stream)和管道(pipe)的工具钱反,從而在進程間使用文本通信掖看。
1.subprocess.call()
父進程等待子進程完成,返回狀態(tài)碼0面哥,否則拋異常
2.subprocess.check_call()
父進程等待子進程完成哎壳,返回0,否則拋異常
3.subprocess.check_output()
父進程等待子進程完成尚卫,返回子進程向標準輸出的輸出結(jié)果归榕。
4.subprocess.Popen()
與上面的幾個函數(shù)不同,Popen對象創(chuàng)建后吱涉,主程序不會自動等待子進程完成刹泄。必須調(diào)用對象的wait()方法,父進程才會等待 (也就是阻塞block)怎爵。
參數(shù) ? ? ?注釋
argsshell ? ? ? ? ? ? ? ? ? ? 命令特石,可以是字符串或者序列類型(如:list,元組)
bufsize ? ? ? ? ? ? ? ? ? ? ? ?指定緩沖鳖链。0 無緩沖,1 行緩沖,其他 緩沖區(qū)大小,負值 系統(tǒng)緩沖
stdin, stdout, stderr ? ? 分別表示程序的標準輸入姆蘸、輸出、錯誤句柄
preexec_fn ? ? ? ? ? ? ? ? ?只在Unix平臺下有效,用于指定一個可執(zhí)行對象(callable object)乞旦,它將在子進程運行之 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 前被調(diào)用
close_sfs ? ? ? ? ? ? ? ? ? ? 在windows平臺下贼穆,如果close_fds被設(shè)置為True,則新創(chuàng)建的子進程將不會繼承父進程的 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 輸入兰粉、輸出故痊、錯誤管道。所以不能將close_fds設(shè)置為True同時重定向子進程的標準輸入玖姑、 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 輸出與錯誤(stdin, stdout, stderr)愕秫。
shell ? ? ? ? ? ? ? ? ? ? ? ? ? ?同上
cwd ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用于設(shè)置子進程的當(dāng)前目錄
env ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用于指定子進程的環(huán)境變量。如果env = None焰络,子進程的環(huán)境變量將從父進程中繼承戴甩。
universal_newlines ? ?不同系統(tǒng)的換行符不同,True -> 同意使用 \n
startupinfo ? ? ? ? ? ? ? ? ?只在windows下有效闪彼,將被傳遞給底層的CreateProcess()函數(shù)甜孤,用于設(shè)置子進程的一些屬 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?性,如:主窗口的外觀畏腕,進程的優(yōu)先級等等
createionflags ? ? ? ? ? ?同上
創(chuàng)建Popen對象:child=subprocess.Popen(...)
可以在父進程中對子進程進行其它操作缴川,如child對象:
child.poll() # 檢查子進程狀態(tài)
child.kill() # 終止子進程
child.send_signal() # 向子進程發(fā)送信號
child.terminate() # 終止子進程
子進程的PID存儲在child.pid
子進程的文本流控制
子進程的標準輸入、標準輸出和標準錯誤如下屬性分別表示:
child.stdin
child.stdout
child.stderr
可以在Popen()建立子進程的時候改變標準輸入描馅、標準輸出和標準錯誤把夸,并可以利用subprocess.PIPE將多個子進程的輸入和輸出連接在一起,構(gòu)成管道(pipe)铭污,如下2個例子:
>>> import subprocess
>>> child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
>>> print child1.stdout.read(),
#或者child1.communicate()
>>> import subprocess
>>> child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
>>> child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)
>>> out = child2.communicate()
subprocess.PIPE實際上為文本流提供一個緩存區(qū)恋日。child1的stdout將文本輸出到緩存區(qū),隨后child2的stdin從該PIPE中將文本讀取走嘹狞。child2的輸出文本也被存放在PIPE中岂膳,直到communicate()方法從PIPE中讀取出PIPE中的文本。