[英]How to stop CMD (from subprocess.popen) closing when an Exception is raised?
[英]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_stdo
或cmd_stde
獲得CMD stdout輸出?
我嘗試嘗試獲取它try, exception
塊為NULL。 而且,我非常確定運行CMD時會有輸出。
如果超時,則永遠不會將變量cmd_stdo
和cmd_stde
分配給它,因為在分配之前會發生異常。
為了確保即使在異常情況下也可以捕獲stdout
和stderr
,我將捕獲到(臨時)文件,然后將它們讀入變量。
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.