python调用外部程序

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

1、os.system( )

        使用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 模块

2、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 ('让它下载,我们接下来做其他事情。。。。')

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值