2011-02-16 155 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