Python学习基础笔记七十五——Python调用其他程序

Python经常被用来开发自动化程序。自动化程序往往需要调用其他的程序。

例如,我们可以代码中调用wget程序,而不是自己开发下载的代码。

这就是我们经常做的,在我们的Python程序中调佣其它程序,帮我们实现功能。

Python中调用外部程序,主要通过两个方法来实现,一个是os库的system函数另外一个是subprocess函数。

os.system函数:

下载wget的windows包。

Python学习基础笔记七十五——Python调用其他程序_第1张图片

在cmd中可以执行:

Python学习基础笔记七十五——Python调用其他程序_第2张图片

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程序。这个意思。

Python学习基础笔记七十五——Python调用其他程序_第3张图片

Python学习基础笔记七十五——Python调用其他程序_第4张图片

下载完成:

Python学习基础笔记七十五——Python调用其他程序_第5张图片

Python学习基础笔记七十五——Python调用其他程序_第6张图片 

 然后,我们把这段代码进行更改:

让用户自己来指定版本:

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说明里面的\符号不进行转义。

 

Python学习基础笔记七十五——Python调用其他程序_第7张图片

这个程序运行的时候,一直要等到下载完毕,最后才打印出‘下载完毕’这句话来。

原来,os.system函数调用外部程序的时候,必须要等到被调用程序执行结束,才会接着往下执行代码,否则就会一直等待。

另外,os.system函数没法获取被调用程序输出到终端窗口的内容。如果需要对被调用程序的输出信息进行处理的话,可以使用subprocess模块。

例如,要获得计算机的内存大小的输出信息。

os.subprocess模块:

subprocess模块提供了更多的调用外部程序的功能。

首先,我们可以获得外部程序输出到屏幕的内容。这在自动化的时候,非常有用。可以用来判断外部程序执行结果是否成功,或者获取我们要分析的数据。

可以使用subprocess里面的Popen类。

Python学习基础笔记七十五——Python调用其他程序_第8张图片

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来进行解码,然后才能转到字符串内容。

你可能感兴趣的:(Python,python)