• 第22课 调用外部程序


    一、调用外部程序

    1、为什么python被称为胶水语言:python可以粘合各种外部程序和各种语言的库,实现特定的功能。

    2、os库里面的system函数,相当于打开操作系统的shell,敲入一个命令,比如打开msprint命令----打开windows下的画图工具。

    3、os.system( )    #如果是系统应用直接写程序名称,如mspaint画图程序;

       如果是第三方应用,需要加上路径名,即:路径+程序名,如打开QQ--- os.system('D:QQTencentQQBinQQScLauncher.exe')

    4、返回值:有些程序退出后会有一个退出码

      1--表示程序是否正确实现了其功能

      2--Linux的命令, 比如ls;echo $?

    5、python在调用这些程序时,退出码作为返回值返回

      1--windows :如果是cmd.exe,返回值就是进程的退出码。

      2--Linux:

        1----会返回一个16位的数字

        2----低位字节,表示结束进程的信号数值

        3-----如果低位字节值为0,高位字节表示退出码

    6、通过subprocess库里面的check_output调用外部程序

      1---subprocess库里面的Popen类,可以

        1---被调用程序运行的时候,就获取其输出的信息

        2---运行时,输入一些信息给被调用程序

      2、subprocress.Popen(args,....stdin = None, stdout = None,,,,  shell = False,.......)

        1...args参数要么是列表,要么是一个字符串-------popen = Popen(args=['mspaint', r'd:1.jpg'])

      3、shell = True 表示用shell去执行,args应该是字符串;

            shell = False 表示不是用shell去执行,args参数应该是一个列表

    7、非阻塞式调用外部程序

      1---调用外部程序后,Python程序继续执行

    8、输入输出重定向    得到外部程序的输出

    2-1

    import os
    os.system('mspaint')    #打开画图工具
    print('after call')   #画图软件不关闭的话,后面的打印语句不会执行。只有关闭了画图工具,才会执行后面一条语句。
    
    执行结果:
    
    
    D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54  python对外部程序的调用/lesson54 知识点.py"

    3--2 打开系统应用

    import os
    os.system('D:QQTencentQQBinQQScLauncher.exe')   #打开第三方应用,格式:os.system('路径.应用程序')
                        
    
    执行结果:
    
    
    D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54  python对外部程序的调用/lesson54 知识点.py"
    
    Process finished with exit code 0

     6-1 通过subproces.check_output来调用外部程序

    import subprocess
    
    # shell= True 表示使用终端shell执行程序,windows下就是cmd.exe
    # 就是python程序电泳cmd.exe  再由cmd.exe执行参数命令
    ret = subprocess.check_output('dir', shell = True, decode = 'gbk')
    # 如果有中文,需要用decode,因为是中文os,所以cmd.exe输出是gbk编码
    print(ret)
    
    
    输出结果:
    
    D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54  python对外部程序的调用/lesson54 知识点.py"
     驱动器 D 中的卷是 软件
     卷的序列号是 DDA0-504F
    
     D:ProgramsHelloWorld2songqinpythonlesson54  python对外部程序的调用 的目录
    
    2020-07-02  13:19    <DIR>          .
    2020-07-02  13:19    <DIR>          ..
    2020-07-02  13:19             2,237 lesson54 知识点.py
    2018-08-22  20:43                 0 __init__.py
                   2 个文件          2,237 字节
                   2 个目录 237,996,130,304 可用字节
    
    
    Process finished with exit code 0

    另外一种写法:

    ret = subprocess.check_output('dir', shell = True)
    
    print(ret.decode('gbk'))

    6-2    subprocress.Popen(args,....stdin = None, stdout = None,,,,  shell = False,.......)

    import subprocess
    
    popen = subprocess.Popen(args = 'mspaint', r'F:1.JPG, shell = False')   #用Popen调用画图工具,打开一副名字为1的照片,shell = False可以省略
    
    
    
    执行结果:
    D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54  python对外部程序的调用/lesson54 知识点.py"
    
    Process finished with exit code 0

    7-1   非阻塞式调用外部程序

    from subprocess import PIPE, Popen
    
    process = Popen(
            args = 'mspaint',
            shell = True
    )
    
    print('done')     #打开画图工具的同时,也执行了print语句,非阻塞式调用。
    
    
    执行结果:
    
    D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54  python对外部程序的调用/lesson54 知识点.py"
    done
    
    Process finished with exit code 0

    8-1  输入输出重定向

    from subprocess import PIPE, Popen
    
    
    popen = Popen(
                 'dir c:',
                 stdout = PIPE,
            stderr = PIPE, shell
    = True, encoding = 'gbk') output, err = popen.communicate() print(output) print(err) # 如果路径正确,则err返回为空 执行结果: D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54 python对外部程序的调用/lesson54 知识点.py" 驱动器 C 中的卷没有标签。 卷的序列号是 A6B6-88CC C: 的目录 2020-07-01 17:51 <DIR> DRMsoft 2020-05-29 11:28 <DIR> Program Files 2020-06-17 17:18 <DIR> Program Files (x86) 2019-06-12 15:51 <DIR> soft 2019-03-19 13:04 <DIR> Users 2020-06-21 10:13 <DIR> Windows 0 个文件 0 字节 6 个目录 71,575,941,120 可用字节 Process finished with exit code 0

    8-2  如果路径出错,则会打印错误信息

    from subprocess import Popen, PIPE
    
    popen = Popen(
        'dir c:\asdf',
        shell= True,
        stdout = PIPE,
        stderr= PIPE,
        encoding = ('gbk'))
    
    output,err = popen.communicate()
    print(output)
    print('--------------------------')
    print(err)
    
    
    
    执行结果:
    D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson54  python对外部程序的调用/lesson54 知识点.py"
     驱动器 C 中的卷没有标签。
     卷的序列号是 A6B6-88CC
    
     c: 的目录
    
    
    --------------------------
    找不到文件
    
    
    Process finished with exit code 0
  • 相关阅读:
    记录下Cookie与Session
    宝塔部署 springboot 项目遇到的 一些bug处理方案
    [IDEA] [SpringBoot] 项目所写的内容不能同步到编译出的文件中
    cookie和session的区别
    JVM类加载
    线程与线程池
    子父类继承相关(static)
    界面控件开发包DevExpress 9月正式发布v21.1.6
    Delphi开发工具DevExpress VCL全新发布v21.1.5
    强大的Visual Studio插件CodeRush v21.1.7已正式发布
  • 原文地址:https://www.cnblogs.com/nick1998/p/13226162.html
Copyright © 2020-2023  润新知