赞
踩
Python中调用外部程序主要是通过两个方法实现的, 一个是 os 库的 system 函数,另外一个是 subprocess 库。
使用os.system( )调用其他程序非常方便,把命令行内容作为 system( ) 的参数即可。
比如:我们使用 wget下载 nginx 安装包,如果在命令行执行是这样的
d:\tools\wget http://mirrors.sohu.com/nginx/nginx-1.13.9.zip
在python中调用,就这样写:
- import os
- cmd = r'd:\tools\wget http://mirrors.sohu.com/nginx/nginx-1.13.9.zip'
- os.system(cmd)
-
- print('下载完毕')
细心的同学可能会发现,上面的程序运行的时候, 一直要等到下载完毕, 最后才打印出 '下载完毕' 这句话来。
原来, os.system 函数调用外部程序的时候, 必须要等被调用程序执行结束, 才会接着往下执行代码。 否则就会一直等待。
os.system 函数没法获取 被调用程序输出到终端窗口的内容。 如果需要对被调用程序的输出信息进行处理的话, 可以使用 subprocess 模块
subprocess 模块提供了 更多的 调用外部程序的功能。
首先,我们可以获取外部程序输出到屏幕的内容。 这在自动化的时候,非常有用。 可以用来判断外部程序执行结果是否成功, 或者获取我们要分析的数据。
比如,我们要分析当前C盘可用空间是否不足10%,如果不足,就显示空间告急。可以使用 subprocess里面的 Popen类。
如下所示 (注意:该代码要以管理员权限运行)
- from subprocess import PIPE, Popen
-
- # 返回的是 Popen 实例对象
- proc = Popen(
- 'fsutil volume diskfree c:',
- stdin = None,
- stdout = PIPE,
- stderr = PIPE,
- shell=True)
-
- # communicate 方法返回 输出到 标准输出 和 标准错误 的字节串内容
- # 标准输出设备和 标准错误设备 当前都是本终端设备
- outinfo, errinfo = proc.communicate()
-
- # 注意返回的内容是bytes 不是 str ,我的是中文windows,所以用gbk解码
- outinfo = outinfo.decode('gbk')
- errinfo = errinfo.decode('gbk')
- print (outinfo)
- print ('-------------')
- print (errinfo)
-
- outputList = outinfo.splitlines()
-
- # 剩余量
- free = int(outputList[0].split(':')[1].replace(',','').split('(')[0].strip())
-
- # 总空间
- total = int(outputList[1].split(':')[1].replace(',','').split('(')[0].strip())
-
- if (free/total < 0.1):
- print('!! 剩余空间告急!!')
- else:
- print('剩余空间足够')
其中 communicate 方法会返回 两个字符串对象。分别对应 被调用程序 输出到 标准输出 和 标准错误 的字节串内容。
命令行程序运行的时候会自动打开 标准输出设备文件 和 标准错误设备文件, 缺省情况下,两者 都是对应当前终端设备。我们可以简单理解为 就是屏幕。
所以这个方法返回的就是 屏幕上显示的内容。但是这个返回的是 bytes 字节串,不是 str 字符串。
前面我们已经学过,bytes要解码为str,就需要调用 decode方法。 我的是中文windows,所以通常外部程序输出的都是gbk编码的字节串。 所以参数指定为gbk。
有的时候,启动外部程序后,我们的Python程序本身并不需要等待外部程序结束。
比如,我们启动 wget下载命令, 下载1个文件。让它下载就可以了, 然后我们的程序还要继续去做其他的任务。
这时候, 我们就不能用os.system, 因为它会等待 外部程序结束。
我们可以用subprocess里面的Popen,像这样
- from subprocess import Popen
- proc = Popen(
- args='wget http://xxxxserver/xxxx.zip',
- shell=True
- )
-
- print ('让它下载,我们接下来做其他事情。。。。')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。