Python经常被用来开发自动化程序。自动化程序往往需要调用其他的程序。
例如,我们可以代码中调用wget程序,而不是自己开发下载的代码。
这就是我们经常做的,在我们的Python程序中调佣其它程序,帮我们实现功能。
Python中调用外部程序,主要通过两个方法来实现,一个是os库的system函数,另外一个是subprocess函数。
os.system函数:
下载wget的windows包。
在cmd中可以执行:
Python程序代码如下:
import os
cmd = r'd:\tools\wget http://mirrors.sohu.com/nginx/nginx-1.13.9.zip'
os.system(cmd)
print('下载完毕')
代码说明:
有python程序,os.system这个有点类似Shell,windows中是cmd命令窗口,然后在shell里面再执行的cmd这段命令。命令里是wget程序。这个意思。
下载完成:
然后,我们把这段代码进行更改:
让用户自己来指定版本:
import os
nginx_version = input('请输入Nginx的指定版本:')
cmd = fr'd:\tools\wget http://mirrors.sohu.com/nginx/nginx-{nginx_version}.zip'
os.system(cmd)
print('下载完毕')
代码说明:
f说明字符串格式化方式。
r说明里面的\符号不进行转义。
这个程序运行的时候,一直要等到下载完毕,最后才打印出‘下载完毕’这句话来。
原来,os.system函数调用外部程序的时候,必须要等到被调用程序执行结束,才会接着往下执行代码,否则就会一直等待。
另外,os.system函数没法获取被调用程序输出到终端窗口的内容。如果需要对被调用程序的输出信息进行处理的话,可以使用subprocess模块。
例如,要获得计算机的内存大小的输出信息。
os.subprocess模块:
subprocess模块提供了更多的调用外部程序的功能。
首先,我们可以获得外部程序输出到屏幕的内容。这在自动化的时候,非常有用。可以用来判断外部程序执行结果是否成功,或者获取我们要分析的数据。
可以使用subprocess里面的Popen类。
C:\Windows\system32>fsutil volume diskfree c:
总可用字节数 : 68,709,957,632 ( 64.0 GB)
总字节数 : 214,748,360,704 (200.0 GB)
总配额可用字节数 : 68,709,957,632 ( 64.0 GB)
不可用池字节数 : 0 ( 0.0 KB)
配额不可用池字节数 : 0 ( 0.0 KB)
已用字节数 : 140,404,006,912 (130.8 GB)
总保留字节数 : 5,634,396,160 ( 5.2 GB)
卷存储保留字节数 : 5,591,650,304 ( 5.2 GB)
可用提交字节数 : 0 ( 0.0 KB)
池可用字节数 : 0 ( 0.0 KB)
人家有现成的程序,我们只要把这个程序工具的结果信息拿过来,得到结果,然后进行处理。
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('剩余空间足够')
代码说明:
shell=True,通过shell执行fsutil命令。
如果,我们要获取到程序输出到终端的内容,我们需要指定stdout=PIPE,PIPE是一个变量,这个值是-1,PIPE是一个管道。这个管道,我们可以通过PIPE读取出来。
communicate 方法返回输出到标准输出和标准错误的字节串内容。
注意是字节串内容bytes,那说明这个字节串内容需要解码,因为是windows操作系统,所以需要使用gbk来进行解码,然后才能转到字符串内容。