zoukankan      html  css  js  c++  java
  • Python 调用外部命令

    python 可以使用 os 模块来调用外部的 Linux Shell 命令,常用的方法如下:

    os.system():结果输出在终端上,捕获不到
    os.popen() : 结果返回一个对象,即标准输出
    os.popen2():结果返回两个对象,分别是标准输入,标准输出
    os.popen3():结果返回三个对象,分别是标准输入,标准输出,标准错误输出
    os.popen4():结果返回两个对象,分别是标准输入,标准输出(标准输出中包括标准错误输出)

    In [2]: stdout = os.system('ls /data')    # os.system() --- 结果输出在终端上,会返回执行命令的状态码,我们可以用变量来接收
    1.txt  2.txt  3.txt
    
    In [3]: print(stdout)
    0
    In [7]: stdout = os.popen('ls /data')    # os.popen() --- 结果返回一个对象,即标准输出,标准输出需要用read()、readlines()等方法读取
    
    In [8]: print stdout.read()
    1.txt
    2.txt
    3.txt
    In [24]: stdin, stdout = os.popen2('cat')    # os.popen2() --- 结果返回两个对象,分别是标准输入,标准输出
    
    In [25]: stdin.write('hello
    ')              # 我们使用 write() 来进行输入,使用 close() 来结束输入,使用 read() 来读取输出
    
    In [26]: stdin.write('world
    ')
    
    In [27]: stdin.close()
    
    In [28]: print stdout.read()
    hello
    world

    使用 os 模块来调用 shell 命令已经过时了,官方建议我们使用 subprocess 模块,subprocess 会开启一个子进程(即shell)来执行命令:

    subprocess.call() :用于执行 shell 命令,但结果不能被捕获到,只会输出到终端,如 subprocess.call('ls -l /data', shell=True)
    subprocess.check_call() :用法与 call() 一致,不同的是,如果命令执行失败,会抛出 CalledProcessError 异常,我们可以根据这个异常去决定需要做什么
    subprocess.Popen() :用于执行 shell 命令,结果返回三个对象,分别是标准输入,标准输出,标准错误输出

    In [1]: from subprocess import Popen, PIPE
    
    In [2]: p = Popen('ls /data', stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True)    # stdin用于接收标准输入,可选参数,可以通过 p.stdin.write('xxx') 添加标准输入
                                                                                       # stdout用于接收标准输出,可选参数,可以通过 p.stdout.read() 读取标准输出
    In [3]: p.stdout.read()                                                            # stderr用于接收标准错误输出,可选参数,可以通过 p.stderr.read() 读取标准错误输出
    Out[3]: '1.txt
    2.txt
    3.txt
    '                                                    # shell=True用于表明该命令是在shell下执行的,如果不加上该参数会报错
                                                                                       # 如果我们没有用PIPE来接收标准输出和标准错误输出,则默认会打印到终端上
    In [4]: p.stderr.read()                                                            # 另外要注意的是,当我们写成 p = Popen(...) 时,命令就已经执行了,执行后的结果放在管道(PIPE)里面
    Out[4]: ''                                                                         # subprocess.Popen()其他常用方法

    线上的用法:

    import subprocess
    
    def runCMD(self, ip, cmd, logfile):
        out = ""
        sshcmd = ''' ssh root@%s -n '%s' ''' % (ip, cmd)
        p = subprocess.Popen(sshcmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        while True:
            buff = p.stdout.readline()
            if p.poll() != None and buff == "":
                break
            if buff:
                out += buff
                self.writeLogFile(logfile, buff)
        return p.returncode, out

        

  • 相关阅读:
    蓝桥杯_买不到的数目
    蓝桥杯_错误票据
    蓝桥杯_数组操作
    剑指OFFER_把二叉树打印成多行
    C语言学习笔记_结构体的内存对齐
    剑指OFFER_二叉搜索树的第k个节点
    局域网ftp工具,带你去探索局域网ftp工具
    这就是Java代码生成器的制作流程(转载)
    ftp工具 绿色,一款非常棒的绿色 ftp工具
    HDFS+ClickHouse+Spark:从0到1实现一款轻量级大数据分析系统(转载)
  • 原文地址:https://www.cnblogs.com/pzk7788/p/10300734.html
Copyright © 2011-2022 走看看