一、调用外部程序
1、为什么python被称为胶水语言:python可以粘合各种外部程序和各种语言的库,实现特定的功能。
2、os库里面的system函数,相当于打开操作系统的shell,敲入一个命令,比如打开msprint命令----打开windows下的画图工具。
3、os.system( ) #如果是系统应用直接写程序名称,如mspaint画图程序;
如果是第三方应用,需要加上路径名,即:路径+程序名,如打开QQ--- os.system('D:QQTencentQQBinQQScLauncher.exe')
4、返回值:有些程序退出后会有一个退出码
1--表示程序是否正确实现了其功能
2--Linux的命令, 比如ls;echo $?
5、python在调用这些程序时,退出码作为返回值返回
1--windows :如果是cmd.exe,返回值就是进程的退出码。
2--Linux:
1----会返回一个16位的数字
2----低位字节,表示结束进程的信号数值
3-----如果低位字节值为0,高位字节表示退出码
6、通过subprocess库里面的check_output调用外部程序
1---subprocess库里面的Popen类,可以
1---被调用程序运行的时候,就获取其输出的信息
2---运行时,输入一些信息给被调用程序
2、subprocress.Popen(args,....stdin = None, stdout = None,,,, shell = False,.......)
1...args参数要么是列表,要么是一个字符串-------popen = Popen(args=['mspaint', r'd:1.jpg'])
3、shell = True 表示用shell去执行,args应该是字符串;
shell = False 表示不是用shell去执行,args参数应该是一个列表
7、非阻塞式调用外部程序
1---调用外部程序后,Python程序继续执行
8、输入输出重定向 得到外部程序的输出
2-1
import os os.system('mspaint') #打开画图工具 print('after call') #画图软件不关闭的话,后面的打印语句不会执行。只有关闭了画图工具,才会执行后面一条语句。 执行结果: D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54 python对外部程序的调用/lesson54 知识点.py"
3--2 打开系统应用
import os os.system('D:QQTencentQQBinQQScLauncher.exe') #打开第三方应用,格式:os.system('路径.应用程序') 执行结果: D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54 python对外部程序的调用/lesson54 知识点.py" Process finished with exit code 0
6-1 通过subproces.check_output来调用外部程序
import subprocess # shell= True 表示使用终端shell执行程序,windows下就是cmd.exe # 就是python程序电泳cmd.exe 再由cmd.exe执行参数命令 ret = subprocess.check_output('dir', shell = True, decode = 'gbk') # 如果有中文,需要用decode,因为是中文os,所以cmd.exe输出是gbk编码 print(ret) 输出结果: D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54 python对外部程序的调用/lesson54 知识点.py" 驱动器 D 中的卷是 软件 卷的序列号是 DDA0-504F D:ProgramsHelloWorld2songqinpythonlesson54 python对外部程序的调用 的目录 2020-07-02 13:19 <DIR> . 2020-07-02 13:19 <DIR> .. 2020-07-02 13:19 2,237 lesson54 知识点.py 2018-08-22 20:43 0 __init__.py 2 个文件 2,237 字节 2 个目录 237,996,130,304 可用字节 Process finished with exit code 0
另外一种写法:
ret = subprocess.check_output('dir', shell = True) print(ret.decode('gbk'))
6-2 subprocress.Popen(args,....stdin = None, stdout = None,,,, shell = False,.......)
import subprocess popen = subprocess.Popen(args = 'mspaint', r'F:1.JPG, shell = False') #用Popen调用画图工具,打开一副名字为1的照片,shell = False可以省略 执行结果: D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54 python对外部程序的调用/lesson54 知识点.py" Process finished with exit code 0
7-1 非阻塞式调用外部程序
from subprocess import PIPE, Popen process = Popen( args = 'mspaint', shell = True ) print('done') #打开画图工具的同时,也执行了print语句,非阻塞式调用。 执行结果: D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54 python对外部程序的调用/lesson54 知识点.py" done Process finished with exit code 0
8-1 输入输出重定向
from subprocess import PIPE, Popen popen = Popen( 'dir c:', stdout = PIPE,
stderr = PIPE, shell = True, encoding = 'gbk') output, err = popen.communicate() print(output) print(err) # 如果路径正确,则err返回为空 执行结果: D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54 python对外部程序的调用/lesson54 知识点.py" 驱动器 C 中的卷没有标签。 卷的序列号是 A6B6-88CC C: 的目录 2020-07-01 17:51 <DIR> DRMsoft 2020-05-29 11:28 <DIR> Program Files 2020-06-17 17:18 <DIR> Program Files (x86) 2019-06-12 15:51 <DIR> soft 2019-03-19 13:04 <DIR> Users 2020-06-21 10:13 <DIR> Windows 0 个文件 0 字节 6 个目录 71,575,941,120 可用字节 Process finished with exit code 0
8-2 如果路径出错,则会打印错误信息
from subprocess import Popen, PIPE popen = Popen( 'dir c:\asdf', shell= True, stdout = PIPE, stderr= PIPE, encoding = ('gbk')) output,err = popen.communicate() print(output) print('--------------------------') print(err) 执行结果: D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54 python对外部程序的调用/lesson54 知识点.py" 驱动器 C 中的卷没有标签。 卷的序列号是 A6B6-88CC c: 的目录 -------------------------- 找不到文件 Process finished with exit code 0