分配我想启动一个流程并检索stdout
和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环境中运行它。
你知道什么是错的吗? 你知道更好的方法吗?
答案 0 :(得分:2)
您必须使用python-3.x。请相应标记您的问题。另外,我不确定您为什么要调用read()
output
方法。 output
是byte 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中完成了一次打印