只能获得stderr的第一行

时间:2013-03-19 19:50:56

标签: python subprocess msys python-3.3

分配我想启动一个流程并检索stdoutstderr。 我并不真正关心实时这个问题。

我想使用subprocess.check_ouput()过程可能会失败。 在阅读StackOverflow和Python文档后,我添加了try .. catch块:

def execute(cmd,timeinsec=60):
  print("execute ",cmd, " with time out ",timeinsec)
  try:
    output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, timeout=timeinsec,universal_newlines=True)
  except subprocess.TimeoutExpired:
    print("timeout expired")
    return "",2
  except subprocess.CalledProcessError:
    print("called process failed")
    return "",1
  print ('The command returned the following back to python:'+output)
  return output,0

但是当我使用output.decode('utf-8')打印输出时 我刚刚得到输出的第一行。

注意:我在Windows上与Msysgit 1.8一起分发的MSys环境中运行它。

你知道什么是错的吗? 你知道更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您必须使用。请相应标记您的问题。另外,我不确定您为什么要调用read() output方法。 outputbyte string,没有read()方法。以下代码适用于我:

#! /usr/bin/env python3
import subprocess

try :
    retcode = 0
    cmd = ["/bin/ls", "/usr/local"]
    output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    output = e.output
    retcode = e.returncode

print(output.decode('utf-8'))
print(retcode)

输出结果为:

bin
etc
games
include
lib
man
sbin
share
src

0

如果我通过将/usr/local替换为/usr/localfoo(不存在)来触发错误,则输出为:

/bin/ls: cannot access /usr/localfoo: No such file or directory

2

最后,您可以将universal_newlines=True添加到check_output()来电,而不必担心在输出中调用decode()

...
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT,universal_newlines=True)
...
...
print(output)

请参考上面的示例,看看是否可以让它重现您的问题。如果您可以重现该问题,请发布您的代码,其输出和所有错误消息(复制,粘贴和重新格式化为SO)。

答案 1 :(得分:0)

<强>解决方案

问题是在子进程中启动的Windows中的应用程序是分配一个控制台(使用Visual构建),并且该进程的stdout已经重定向到外部,并且在此重定向之前只在原始cout中完成了一次打印