簡體   English   中英

在引發異常時捕獲subprocess.Popen的stdout

[英]capture stdout of subprocess.Popen when there is exception raised

當引發異常時,如何從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 timeout超過60 secs ,如何在cmd_stdocmd_stde獲得CMD stdout輸出?

我嘗試嘗試獲取它try, exception塊為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)

(嘗試此操作時,請在代碼中使用睡眠和超時​​時間進行操作,以使超時發生與否)

由於我沒有足夠的聲譽,因此我必須以這種方式要求澄清。

您要在Windows或Linux上運行它嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM