【Python】在代码中执行终端命令并获取输出和运行状态

2024-02-27 2126阅读

文章目录

  • 0 前言
  • 1 os库
    • 1.1 os.system
    • 1.2 os.popen
    • 2 subprocess库
      • 2.1 subprocess.run
      • 2.2 subprocess.Popen
      • 3 参考

        0 前言

          在Python编程过程中,我们可能会遇到需要在终端命令行执行某个命令并获取其输出的操作,我们首先想到可能就是C语言中的system("pause");语句,确实,python当中也有类似的命令,同时,为了满足进一步的需求,比如判断指令是否执行完毕或者是得到执行输出的内容。

        1 os库

        1.1 os.system

          这个指令仅在终端运行该指令,不能获取命令行返回的信息,但是它会在输出终端显示命令执行的输出。

        # test.py
        print("Hello")
        # run.py
        import os
        cmd = "python test.py"
        os.system(cmd)
        # output:
        Hello
        

        这个操作是会堵塞程序执行

        1.2 os.popen

          os.popen不仅可以执行命令,还可以返回执行结果

        # test.py
        print("Hello")
        # run.py
        import os
        cmd = "python test.py"
        out = os.popen(cmd)
        print(out.readlines())
        # output:
        ['Hello\n']
        

          不过,这个库需要注意的是,如果命令执行输出有中文掺杂,最好不要使用这个命令,它的编码可能会存在一定问题。

        2 subprocess库

          subprocess库主要功能是输入输出流,在VS Code中打开它的说明,如下图所示。

        【Python】在代码中执行终端命令并获取输出和运行状态 第1张

        从图中可以看出这个库的主要两个函数接口是run和Popen,往下翻还可以找到它其他的一些比较老的函数。这里介绍这两种主要函数的使用。

        2.1 subprocess.run

          根据上面的subprocess的说明,可以知道,run函数可以在命令行运行一个指令,并等待它运行完毕,并返回一个“已结束进程的实例”。这个函数的参数比较多,这里简单介绍几个。

        【Python】在代码中执行终端命令并获取输出和运行状态 第2张

        args :  需要执行的命令行(cmd命令行,不是shell)
        stdout :  命令执行完的输出,可以设置为一个文件对象,或者是它自带的类PIPE
        stderr :  命令行执行完的报错信息,参数设置和stdout一样
        encoding :  编码设置,因为它默认的输出都是bytes,十六进制的,加上这个可以转换成字符串格式,
        			如果不加上这个也可以在获取输出时decode一下,变成字符串。
        shell :  这个似乎不是指定在powershell中执行,但一般会加上 shell = True
        

          下面是一个简单的实例

        # test.py
        print("Hello")
        # run.py
        import subprocess
        cmd = "python test.py"
        b = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE).stdout
        print(b.decode('gbk')) 
        

          需要注意,这里要使用gbk的编码方式,这个可能是和subprocess这个库有关,它内部默认使用的终端是cmd终端,编码方式有些特殊。如果使用默认的utf-8解码会出现报错 ‘utf-8’ codec can’t decode byte 0xb9 in position 0: invalid start byte ,具体原理和解决方式可以参考这篇博客。

        2.2 subprocess.Popen

          Popen函数和run函数非常相似,但是它执行命令时是新开一个进程,而不是像run函数一样堵塞执行,因此用Popen可以实现同时执行多条指令(但也不能太多)。此外Popen的返回值可以调用wait函数来查看指令执行状态,判断是否执行完毕。

        3 参考链接

        • 在python中运行命令行命令的四种方案
        • python 执行命令,并获取结果及执行状态(os.popen、subprocess.Popen、os.system)

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]