1. 阻塞性調用,不需要執行指令得到的傳回結果,可以用 os.system
2. 阻塞性調用,需要執行指令得到的傳回結果,可以用subprocess庫裡面的check_output
3.非阻塞性調用,需要執行指令得到的傳回結果,可以用subprocess庫裡的Popen類
os庫裡的system函數,等于打開作業系統的shell,敲入一串指令。這是一種阻塞性調用。eg:
import os
os.system('mspaint') #打開畫圖工具
print('after call') #等待畫圖工具關閉後,才會執行這句。
組裝參數,工具軟體指令行運作參數,組裝出相應的參數。 os.system(r'mspaint d:\1.jpg')
傳回值
有些程式退出後會有一個退出碼
表示程式是否正确實作了其功能
liunx的指令 比如ls;echo $? #正确
Python在用這些程式時,退出碼作為傳回值傳回
windows: 如果是cmd.exe, 傳回值就是程序的退出碼
import os
ret = os.system('dir')
print(ret) #傳回最後一個0
ret = os.system(dir sdfsf)
print(ret1) #傳回最後一個是1
So,可以通過傳回值來判斷指令是否執行成功
import os
ret = os.system('cp /opt/file1 /home/file1')
if ret == 0:
print('filed copied')
else:
print('copy file failed!!')
subprocess庫裡面的check_output,需要等到被調用程式退出, 才能傳回。
import subprocess
#shell=True表示使用終端shell程式,windows下就是cmd.exe,就是我們python程式調用cmd.exe,再由cmd.exe執行參數指令
ret = subprocess.check_output('dir',shell=True,encoding='gbk')
#如果有中文,需要decode, 因為是中文os, 是以cmd.exe輸出就是gbk編碼
print(ret)
subprocess庫裡的Popen類,可以被調用程式運作的時候,就擷取其輸出的資訊(非阻塞性調用)
運作時,輸入一些資訊給被調用程式
subprocess.Popen(args,stdin=None,stdout=None,stderr=None,shell=False,encoding=None)
args參數要麼是清單,要麼是一個字元串
popen = Popen(args=['mspaint',r'e:\1.jpg']) #清單裡第一是指令,第二個是參數。
shell =True表示用shell去執行,args應該是字元串
shell=False表示 不是用shell去執行, args參數應該是一個清單
非阻塞性調用程式
from subprocess import Popen
popen = Popen(
args = 'mspaint'
shell=True
)
print('done') #執行完打開畫圖後不需要等畫圖關閉就列印done了。
輸入輸出重定向
得到外部程式的輸出
from subprocess improt PIPE, Popen
popen = Popen(
'dir c:',
stdout = PIPE, #将标準輸出重定向PIPE
stderr = PIPE #将标準錯誤重定向PIPE
shell =True,
encoding = 'gbk')
output, err = popen.communitcate() #傳回的标準輸出,标準錯誤指派給output, err
print(output)