使用超时设置从子进程捕获输出
Capture output from subprocess with a timeout set
我正在使用 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
未定义。
如何设置超时但仍然捕获超时前打印的任何输出?
最终我发现您可以将文件直接传递给 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
子进程将 stdout/stderr 直接保存到文件中,以后可以查看,无论子进程是否因超时而停止。
您仍然可以使用原始代码中的 capture_output
属性,当抛出 TimeoutExpired
异常时,您可以从那里收集 stdout
和 stderr
。例如:
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
我正在使用 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
未定义。
如何设置超时但仍然捕获超时前打印的任何输出?
最终我发现您可以将文件直接传递给 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
子进程将 stdout/stderr 直接保存到文件中,以后可以查看,无论子进程是否因超时而停止。
您仍然可以使用原始代码中的 capture_output
属性,当抛出 TimeoutExpired
异常时,您可以从那里收集 stdout
和 stderr
。例如:
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