![](/img/trans.png)
[英]How to capture intermediate error in python subprocess's piped execution
[英]how to capture subprocess error
在 Python 中,我運行了一個使用 FORTRAN 制作的 exe。我使用了subprocess
模塊。 該exe訪問並寫入多個文件。 如果我將這些文件設置為只讀,我會在我的 Python 控制台中看到以下跟蹤。
我嘗試使用try
, except
語句。 但是我無法捕獲錯誤。 我也嘗試使用p.stdout.readline()
。 但是沒有成功。
是否有系統的方法來捕獲此類錯誤。
代碼:
import subprocess
p = subprocess.Popen('C:\\TGSSR\\test.exe' , shell=True, stdout=subprocess.PIPE)
追溯:
forrtl: severe (9): permission to access file denied, unit 6, file C:\test\mar22_SSOUT\RawReadLog.dat
Image PC Routine Line Source
test.exe 0116DC40 Unknown Unknown Unknown
test.exe 0113D42F Unknown Unknown Unknown
test.exe 0112AE97 Unknown Unknown Unknown
test.exe 0112A1DA Unknown Unknown Unknown
test.exe 0110D746 Unknown Unknown Unknown
test.exe 0108B9AC Unknown Unknown Unknown
test.exe 01173FE3 Unknown Unknown Unknown
test.exe 011588F5 Unknown Unknown Unknown
kernel32.dll 76D33677 Unknown Unknown Unknown
ntdll.dll 77A39F42 Unknown Unknown Unknown
ntdll.dll 77A39F15 Unknown Unknown Unknown
運行流程:
p = subprocess.Popen(['C:\\TGSSR\\test.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# shell = True is not needed
要捕獲錯誤消息:
stdout, stderr = p.communicate()
# stdout = normal output
# stderr = error output
檢查進程返回碼:
if p.returncode != 0:
# handle error
Python 3.5 引入了subprocess.run()
方法。
這是針對 Python >=3.5 更新的 @kirbyfan64sos 答案:
運行流程:
p = subprocess.run(['C:\\TGSSR\\test.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
在 >=3.5 中,您可以從執行的進程中訪問returncode
、 stdout
和stderr
。
要捕獲錯誤消息:
stdout = p.stdout # stdout = normal output
stderr = p.stderr # stderr = error output
檢查進程返回碼:
if p.returncode != 0:
# handle error
如果不需要 Popen 的所有功能而只需要獲取標准輸出,您還可以選擇:
try:
output = subprocess.check_output('C:\\TGSSR\\test.exe')
except subprocess.CalledProcessError as e:
print("Oops... returncode: " + e.returncode + ", output:\n" + e.output)
else:
print("Everything ok:\n" + output)
編輯:正如 mgilson 在另一個答案中指出的那樣,這需要在失敗時使用非零返回碼。 如果不是這種情況,您可以嘗試以下方法:
output = subprocess.check_output('C:\\TGSSR\\test.exe')
if "permission to access file denied" in output:
print("Failed")
一些字符串只會在出現錯誤時出現在標准輸出上
在大多數情況下,您需要使用 subprocess.run。 要捕獲錯誤,您必須使用參數“capture_output=True, check=True”
check=True 真的很有必要。
try:
subprocess.run(args, cwd, capture_output=True, check=True)
except subprocess.CalledProcessError as e:
print("Error while executing YoloV5:")
for k, v in e.__dict__.items():
print(k)
if isinstance(v, bytes):
print(v.decode("utf-8"))
else:
print(v)
raise Exception("Error in subcommand")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.