天天看点

笔记整理--调用外部程序

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)