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


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

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

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

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

    os.system函数

    下载wget的windows包。

    在cmd中可以执行:

    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('下载完毕')

    代码说明:

    有python程序,os.system这个有点类似Shell,windows中是cmd命令窗口,然后在shell里面再执行的cmd这段命令。命令里是wget程序。这个意思。

    下载完成:

     

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

    让用户自己来指定版本:

    1. import os
    2. nginx_version = input('请输入Nginx的指定版本:')
    3. cmd = fr'd:\tools\wget http://mirrors.sohu.com/nginx/nginx-{nginx_version}.zip'
    4. os.system(cmd)
    5. print('下载完毕')

    代码说明:

    f说明字符串格式化方式。

    r说明里面的\符号不进行转义。

     

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

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

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

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

    os.subprocess模块:

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

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

    可以使用subprocess里面的Popen类。

    1. C:\Windows\system32>fsutil volume diskfree c:
    2. 总可用字节数 : 68,709,957,632 ( 64.0 GB)
    3. 总字节数 : 214,748,360,704 (200.0 GB)
    4. 总配额可用字节数 : 68,709,957,632 ( 64.0 GB)
    5. 不可用池字节数 : 0 ( 0.0 KB)
    6. 配额不可用池字节数 : 0 ( 0.0 KB)
    7. 已用字节数 : 140,404,006,912 (130.8 GB)
    8. 总保留字节数 : 5,634,396,160 ( 5.2 GB)
    9. 卷存储保留字节数 : 5,591,650,304 ( 5.2 GB)
    10. 可用提交字节数 : 0 ( 0.0 KB)
    11. 池可用字节数 : 0 ( 0.0 KB)

     人家有现成的程序,我们只要把这个程序工具的结果信息拿过来,得到结果,然后进行处理。

    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('剩余空间足够')

    代码说明:

    shell=True,通过shell执行fsutil命令。

    如果,我们要获取到程序输出到终端的内容,我们需要指定stdout=PIPE,PIPE是一个变量,这个值是-1,PIPE是一个管道。这个管道,我们可以通过PIPE读取出来。

    communicate 方法返回输出到标准输出和标准错误的字节串内容。

    注意是字节串内容bytes,那说明这个字节串内容需要解码,因为是windows操作系统,所以需要使用gbk来进行解码,然后才能转到字符串内容。

  • 相关阅读:
    选择程序员生涯发展方向
    4.mysql-进阶
    Vue中的数据筛选与搜索功能实现
    基于ESP32的蓝牙鼠标键盘(一)BleKeyboard.h函数解析
    数据结构概念
    PostgreSQL、KingBase 数据库 ORDER BY LIMIT 查询缓慢案例
    排列(全排,前一个,下一个)
    正在等待操作系统重新启动。 请重新启动计算机以安装autocad 2024。
    架构自治服务:构建数据驱动的架构洞察
    java计算机毕业设计基于安卓Android微信的学生家庭个人支出管理小程序 uniAPP
  • 原文地址:https://blog.csdn.net/chang_chunhua/article/details/133880957