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

        

  • 相关阅读:
    hdu5728 PowMod
    CF1156E Special Segments of Permutation
    CF1182E Product Oriented Recurrence
    CF1082E Increasing Frequency
    CF623B Array GCD
    CF1168B Good Triple
    CF1175E Minimal Segment Cover
    php 正则
    windows 下安装composer
    windows apache "The requested operation has failed" 启动失败
  • 原文地址:https://www.cnblogs.com/pzk7788/p/10300734.html
Copyright © 2011-2022 走看看