天天看點

筆記整理--調用外部程式

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)