0

分配我想启动一个进程并检索stdoutand stderr。我真的不关心实时获得这个。

我想使用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 环境中运行它。

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

4

2 回答 2

2

您必须使用。请相应地标记您的问题。另外,我不确定您为什么要read()调用output. 这output是一个字节字符串,没有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=Truecheck_output()调用,而不必担心调用decode()输出:

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

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

于 2013-03-19T21:03:21.103 回答
0

解决方案

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

于 2013-03-20T10:41:15.327 回答