python - 当出现异常时捕获 subprocess.Popen 的标准输出

标签 python exception subprocess

当出现异常时,如何从 subprocess.Popen CMD 调用捕获 stdout/stderr?

代码片段:

p_cmd = subprocess.Popen(CMD, bufsize=0, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(cmd_stdo, cmd_stde) = p_cmd.communicate(timeout=60)

如果 CMD 运行时间超过 60 秒超时,我如何在 cmd_stdocmd_stde 中获取 CMD 标准输出

我尝试将它放在try,exception block 中,它是NULL。 而且,我非常确定运行 CMD 时有输出。

最佳答案

如果超时,变量 cmd_stdocmd_stde 永远不会被赋值,因为异常发生在赋值之前。

为了确保即使在异常情况下也能捕获 stdoutstderr,我会捕获到(临时)文件并随后将它们读入变量中。

import subprocess
from tempfile import TemporaryFile as Tmp

CMD = [ 'echo "before sleep" ; sleep 7 ; echo "after sleep"' ]

with Tmp() as out, Tmp() as err:
    p_cmd = subprocess.Popen(CMD, bufsize=0, shell=True, stdin=None, stdout=out, stderr=err)
    timed_out = False
    try:
        p_cmd.wait(timeout=5)
    except subprocess.TimeoutExpired:
        timed_out = True
    out.seek(0)
    err.seek(0)
    str_out = out.read()
    str_err = err.read()

print('Has timed out:', timed_out)
print('Stdout:', str_out)
print('Stderr:', str_err)

(尝试此操作时,请在代码中使用 sleep 和超时​​时间来决定超时是否发生)

关于python - 当出现异常时捕获 subprocess.Popen 的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57072731/

相关文章:

java - 抛出 IOException 和 RuntimeException 之间的区别

exception - DATA_ERR : DOM IDBDatabase Exception 5 in Chrome, 如何修复?

c# - 从线程向主线程发送异常?

python - 如何与外部Python进程通信? (不是子进程)

python - Pandas:Dataframe 计算 - 带除法的新行、带总和和平均值的新列

python - QThread 到 QProcesses 的信号/槽

python - List Comprehension 在 Python 中是如何工作的?

python - 螃蟹 : why is crab's UserBasedRecommender so slow?

如果创建了 multiprocessing.Pool,Python 子进程 wait() 将失败

Python 的子进程删除 Mysql 列和间距