Python - 子进程 - getstatusoutput

时间:2013-12-19 11:26:48

标签: python subprocess output

我也是Python和编程的新手。我从Google的python类中知道如何使用以下命令运行外部命令:

  

(status,output)= commands.getstatusoutput(cmd)
   如果状态:##错误情况,将命令的输出打印到stderr并退出
     sys.stderr.write(输出)
     sys.exit(1)

但我认为命令模块已经过时了。我想要状态和输出,所以我可以使用sys.stderr.write()打印输出,如果有任何错误。那么, subprocess 模块中是否有任何等效命令?我目前正在使用:

  现在

subprocess.call(args,shell = False)。

谢谢!

4 个答案:

答案 0 :(得分:2)

subprocess.getstatusoutput() in Python 3could be implemented as

from subprocess import check_output, CalledProcessError, STDOUT

def getstatusoutput(cmd):
    try:
        data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT)
        status = 0
    except CalledProcessError as ex:
        data = ex.output
        status = ex.returncode
    if data[-1:] == '\n':
        data = data[:-1]
    return status, data

两者都返回status,与原始commands.getstatusoutput()不同。请参阅Python Issue: Document & unittest the subprocess.getstatusoutput() status value

答案 1 :(得分:1)

也可以用更少的代码

来做到这一点
from subprocess import Popen, PIPE

def getstatusoutput(command):
    process = Popen(command, stdout=PIPE)
    out, _ = process.communicate()
    return (process.returncode, out)

code, out = getstatusoutput(["echo", "some text"])
print code
print out

答案 2 :(得分:0)

Popen是一种很好的简单方法:

from subprocess import Popen, PIPE

def local(command):
    print 'local', local
    process = Popen(command.split(), stdout=PIPE, stderr=PIPE)
    out = process.stdout.read()
    err = process.stderr.read()
    print 'out', out
    print 'err', err
    returncode = process.wait()
    if returncode:
        raise Exception(returncode, err)
    else:
        return out

答案 3 :(得分:0)

getstatusoutput所做的是将stdoutstderr输出交错收集在一个变量中。这将非常密切地复制getstatusoutput实际行为在那些不存在的行为上getstatusoutput并且整个commands模块已完全在Python 3上删除了) ,除了换行符之外。结果数据位于bytes

def getstatusoutput(cmd):
    subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    out, _ = process.communicate()

    if out[-1:] == b'\n':
        out = out[:-1]

    return (process.returncode, out)

此函数故意在Python 3上返回bytes,因为Python 2版本返回str