2013-12-19 141 views
2

我是Python和编程的新手。我从谷歌的Python类知道如何使用运行外部命令:Python - subprocess - getstatusoutput

(状态输出)= commands.getstatusoutput(CMD)
如果状态:##错误的情况下,打印命令的输出到stderr和退出
sys.stderr.write(输出)
sys.exit(1)

但是我看出命令模块将会过时。我想要的状态和输出,所以我可以打印输出使用sys.stderr.write()如果有任何错误。那么,子模块模块中是否有等价命令?我目前正在使用:

subprocess.call(args,shell = False)now。

谢谢!

+0

'try'块中的'subprocess.check_output'将是最接近的等值。 – Blender

回答

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 
+0

如果子进程生成足够的输出以填充stderr的OS管道缓冲区,则代码会死锁。 – jfs

+0

很抱歉,这是错误的答案。 –

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 
0

不会有什么getstatusoutput地采集stdoutstderr输出交错在一个变量中。这将非常接近地复制getstatusoutput的行为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

+0

它不会复制实际行为:[您需要修剪换行符(并在Python 3上返回文本)](http://stackoverflow.com/a/28483026/4279)。 – jfs

+0

这也返回一个[不同的状态](http://bugs.python.org/issue23508) – jfs

2

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

from subprocess import check_output, CalledProcessError 

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