Python中調用shell腳本,常用的函數有os.system、os.popen()和subprocess.Popen()
- os.system方法
語法:os.system(cmd)
os.system()執行過程中主要執行了:fork()出一子進程;子進程調用exec()執行命令。
例1:>>> import os >>> os.system('dir D:\Python')
執行成功,返回0。
例2:import os res = os.system('ping www.baidu.com -n 3') if res == 0: print('成功') else: print('失敗了')
執行結果:
注:
1).os.system()執行cmd指令,返回結果0表示執行成功,返回1表示失敗。
2).os.system()無法獲取在cmd輸出的內容。
3).os.system()調用外部系統命令,返回命令結果碼,無法獲取命令執行輸出結果。 - os.popen方法
語法:popen(cmd, mode='r', buffering = -1)
參數:cmd:要執行的命令。 mode:打開文件的模式,默認爲'r',用法與open()相同。 buffering:(可選參數),0表無緩衝;1錶行緩衝;-1表默認緩衝值;
os.popen()方法會打開一管道,返回結果是一連接管道的文件對象。執行成功返回文件對象中讀取的返回結果,不返回狀態碼。執行失敗,返回執行的錯誤信息。並且返回結果可賦於一變量,便於程序的處理。
例1:
文件內容:D:\Python\test.pyprint('popen()測試')
文件內容:D:\Python\test2.py
res = os.popen(r'D:\Python\test.py', mode='r') res1 = res.read() #返回結果賦於一變量,便於程序的處理 print(res1) print(type(res1)) #返回str res.close()
python D:\Python\test2.py 執行結果:
- subprocess模塊
os.system、os.popen實現的功能在subprocess模塊都可實現,推薦使用。並且subprocess模塊還可調用外部系統命令來創建新子進程。subprocess執行系統命令的時候並不會讓主進程去執行,而是主進程會開闢fork()出一個子進程去執行,並不會影響到主進程的運行。
subprocess模塊主要有call()、Popen()函數。
3.1 subprocess.Popen()函數
語法:subprocess.Popen(args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
args:要調用的外部系統命令。
bufsize:默認值爲0, 表示不緩存;爲1表示行緩存;其他正數表示緩存使用的大小;負數-1表示使用系統默認的緩存大小。
stdin、stdout、stderr:分別表示標準輸入、標準輸出和標準錯誤。其值有PIPE、文件描述符和None等。默認值爲None,表示從父進程繼承。
shell:Linux中參數值爲False時,Linux上通過調用os.execvp執行對應的程序。True時,Linux上直接調用系統shell來執行程序。Windows中參數shell設爲true,程序將通過shell來執行。
cwd:設置子進程當前目錄。
env:env是字典類型,指定子進程的環境變量。默認值爲None,表示子進程的環境變量將從父進程中繼承。
subprocess.PIPE:在創建Popen對象時,subprocess.PIPE可以初始化stdin, stdout或stderr參數,表示與子進程通信的標準流。執行結果丟到管道(共享內存空間,用於進程之間共享)。
例1:cmd = 'ipconfig | findstr "192.168.1.128"' p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) #將正確的執行結果丟到管道中。 res = p.stdout.read().decode('gbk') #主進程去管道里獲取正確stdout的結果,並將獲取的結果的bytes類型轉換。 print(res) print(type(res))
subprocess.Popen()方法與os.popen()相比較,os.popen()獲取的輸出結果是直接可讀的,而subprocess.Popen()獲取的輸出結果是以二進制形式的且會有換行符。
3.2 subprocess.call()函數
調用外部系統命令,並返回執行結果碼。功能類似於os.system(cmd)。0表示執行成功,返回1表示失敗。
例子2:import subprocess res = subprocess.call('ping www.baidu.com', shell=True) print('>>> ping www.baidu.com') print('測試res:', res)
結果: