当前位置:   article > 正文

python调用外部程序_python怎么引用其他程序

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中调用,就这样写:

  1. import os
  2. cmd = r'd:\tools\wget http://mirrors.sohu.com/nginx/nginx-1.13.9.zip'
  3. os.system(cmd)
  4. print('下载完毕')

        细心的同学可能会发现,上面的程序运行的时候, 一直要等到下载完毕, 最后才打印出 '下载完毕' 这句话来。

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

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

2、subprocess

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

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

比如,我们要分析当前C盘可用空间是否不足10%,如果不足,就显示空间告急。可以使用 subprocess里面的 Popen类。

如下所示 (注意:该代码要以管理员权限运行)

  1. from subprocess import PIPE, Popen
  2. # 返回的是 Popen 实例对象
  3. proc = Popen(
  4. 'fsutil volume diskfree c:',
  5. stdin = None,
  6. stdout = PIPE,
  7. stderr = PIPE,
  8. shell=True)
  9. # communicate 方法返回 输出到 标准输出 和 标准错误 的字节串内容
  10. # 标准输出设备和 标准错误设备 当前都是本终端设备
  11. outinfo, errinfo = proc.communicate()
  12. # 注意返回的内容是bytes 不是 str ,我的是中文windows,所以用gbk解码
  13. outinfo = outinfo.decode('gbk')
  14. errinfo = errinfo.decode('gbk')
  15. print (outinfo)
  16. print ('-------------')
  17. print (errinfo)
  18. outputList = outinfo.splitlines()
  19. # 剩余量
  20. free = int(outputList[0].split(':')[1].replace(',','').split('(')[0].strip())
  21. # 总空间
  22. total = int(outputList[1].split(':')[1].replace(',','').split('(')[0].strip())
  23. if (free/total < 0.1):
  24. print('!! 剩余空间告急!!')
  25. else:
  26. print('剩余空间足够')

         其中 communicate 方法会返回 两个字符串对象。分别对应 被调用程序 输出到 标准输出 和 标准错误 的字节串内容。

命令行程序运行的时候会自动打开 标准输出设备文件 和 标准错误设备文件, 缺省情况下,两者 都是对应当前终端设备。我们可以简单理解为 就是屏幕。

所以这个方法返回的就是 屏幕上显示的内容。但是这个返回的是 bytes 字串,不是 str 字串。

前面我们已经学过,bytes要解码为str,就需要调用 decode方法。 我的是中文windows,所以通常外部程序输出的都是gbk编码的字节串。 所以参数指定为gbk。


        有的时候,启动外部程序后,我们的Python程序本身并不需要等待外部程序结束。

比如,我们启动 wget下载命令, 下载1个文件。让它下载就可以了, 然后我们的程序还要继续去做其他的任务。

这时候, 我们就不能用os.system, 因为它会等待 外部程序结束。

我们可以用subprocess里面的Popen,像这样

  1. from subprocess import Popen
  2. proc = Popen(
  3. args='wget http://xxxxserver/xxxx.zip',
  4. shell=True
  5. )
  6. print ('让它下载,我们接下来做其他事情。。。。')

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/74705
推荐阅读
相关标签
  

闽ICP备14008679号