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)