2011-02-16 140 views
6

我在Windows Server 2008 R2 x64機箱上使用Python 2.7.1Python:從命令行獲取輸出,該命令行以非零退出代碼退出

我想獲得輸出我需要的信息後給出非零退出狀態的命令行進程的輸出。

我最初使用的是subprocess.check_output,並捕獲了非零退出狀態下發生的CalledProcessError,但是當返回代碼存儲在錯誤中時,沒有輸出顯示這一點。

運行這種情況下,給出輸出,但退出狀態爲0正常工作,我可以得到輸出使用subprocess.check_output。

我的假設是輸出被寫入STDOUT,但異常從STDERR中提取其'輸出'。我試着重新實現check_output的功能,但是當我相信我應該看到輸出到STDOUT和STDERR時,輸出仍然沒有任何結果。我當前的代碼如下(其中「命令」是全文,包括參數,命令我運行:

process = subprocess.Popen(command, stdout=subprocess.PIPE, 
stderr=subprocess.STDOUT, universal_newlines=True) 
output = process.communicate() 
retcode = process.poll() 
if retcode: 
    raise subprocess.CalledProcessError(retcode, image_check, output=output) 
    return output 

這使我在可變輸出如下:

是我subprocess.Popen代碼糾正?

+0

``.communicate()`之後,你可以直接使用`process.returncode`而不是`process.poll()`。 – jfs 2013-08-20 10:48:15

+0

如何從Python的命令行獲得輸出:http://stackoverflow.com/a/20456745/445131 – 2013-12-08 17:53:29

回答

8

你的代碼工作正常。原來,那您呼叫的過程可能正在輸出到CON。請看下面的例子

import subprocess 

def check_output(command): 
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) 
    output = process.communicate() 
    retcode = process.poll() 
    if retcode: 
      raise subprocess.CalledProcessError(retcode, command, output=output[0]) 
    return output 

command = "echo this>CON" 

print "subprocess -> " + subprocess.check_output(command, shell=True) 
print "native -> " + str(check_output(command)) 

try: 
    subprocess.check_output("python output.py", shell=True) 
except subprocess.CalledProcessError, e: 
    print "subproces CalledProcessError.output = " + e.output 

try: 
    check_output("python output.py") 
except subprocess.CalledProcessError, e: 
    print "native CalledProcessError.output = " + e.output 

輸出

subprocess -> 
native -> ('', None) 
stderr subproces CalledProcessError.output = stdout 
native CalledProcessError.output = stderr stdout 

可悲的是,我不知道如何解決這個問題。請注意,subprocess.check_output結果僅包含stdout的輸出。您的check_output替換將輸出stderr和stdout。

在檢查了subprocess.check_output之後,它確實生成了一個CalledProcessError,其輸出僅包含stdout。

1

您是否嘗試過stderr=subprocess.STDOUT如蟒蛇文檔頁提到:

要還捕獲標準錯誤的結果,使用 標準錯誤= subprocess.STDOUT:

下面是測試代碼:

import subprocess 

try: 
    subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True) 
except subprocess.CalledProcessError as e: 
    print 'e.output: ', e.output 


try: 
    subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True, stderr=subprocess.STDOUT) 
except subprocess.CalledProcessError as e: 
    print 'e.output: ', e.output 

輸出:

errrrr 
e.output: 
e.output: errrrr