使用设置超时的子进程捕获输出

3

我正在使用subprocess.run来运行命令并捕获输出,代码如下:

proc = subprocess.run([commandAndFlags], capture_output=True)

if proc.stdout:
    print('stdout:', str(proc.stdout))
if proc.stderr:
    print('stderr:', str(proc.stderr))

我想添加一个超时时间,但在超时之前仍然捕获发送到stdout/stderr的任何输出。
但是,如果我只是添加超时并将其包装在try/except中,我无法捕获子进程的输出。
try:
    proc = subprocess.run([commandAndFlags], capture_output=True, timeout=2000)
except subprocess.TimeoutExpired:
    print('Timeout!!')

if proc.stdout:
    print('stdout:', str(proc.stdout))
if proc.stderr:
    print('stderr:', str(proc.stderr))

当我尝试打印stdout/stderr时,现在proc未定义。

我该如何设置超时但仍捕获在超时之前打印的任何输出?

2个回答

5

您仍然可以使用原始代码中的capture_output属性,当引发TimeoutExpired异常时,您可以从那里收集stdoutstderr。例如:

try:
    proc = subprocess.run([commandAndFlags], capture_output=True, text=True, timeout=2000)
    outs = proc.stdout
    errs = proc.stderr
except subprocess.TimeoutExpired as timeErr:
    outs = timeErr.stdout
    errs = timeErr.stderr


我喜欢这种方法,但是text=TruetimeErr数据没有影响。我使用了outs = timeErr.stdout.decode() - undefined

0

最终我弄明白了你可以直接传递文件给subprocess.run

outfile = 'outfile.txt'
errfile = 'errfile.txt'
try:
  proc = subprocess.run([commandAndFlags], timeout=2000
                        stdout=open(outfile, 'w'), stderr=open(errfile, 'w'))
except subprocess.TimeoutExpired:
    print('Timeout!!')

# check if outfile/errfile files exist and print contents

subprocess会直接将stdout/stderr保存到一个文件中,无论子进程是否被超时停止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接