Python: get output from a command line which exits with nonzero exit code
我正在Windows Server 2008 R2 x64设备上使用
我正在尝试获取一个命令行进程的输出,它在输出我需要的信息后给出一个非零的退出状态。
我最初使用的是
在给出输出但退出状态为0的情况下运行此命令可以正常工作,我可以使用subprocess.check_output获取输出。
我的假设是输出被写入stdout,但异常从stderr中提取其"输出"。我已经尝试重新实现check_输出的功能,但是当我认为应该看到stdout和stderr的输出时,我仍然没有得到任何关于输出的信息。我当前的代码如下(其中"command"是我正在运行的命令的全文,包括参数:
1 2 3 4 5 6 7 | 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 |
这在变量输出中给出了以下内容:
我的
你的代码工作正常。结果表明,您调用的进程可能输出到con。请参见以下示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 |
产量
1 2 3 4 | subprocess -> native -> ('', None) stderr subproces CalledProcessError.output = stdout native CalledProcessError.output = stderr stdout |
遗憾的是,我不知道如何解决这个问题。注意,
在检查了
您是否如python doc页面中所述尝试过
To also capture standard error in the result, use
stderr=subprocess.STDOUT:
以下是测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
输出:
1 2 3 | errrrr e.output: e.output: errrrr |
这里有个问题可能会打中你-http://bugs.python.org/issue9905