2013-12-19 62 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