簡體   English   中英

如何捕獲子進程錯誤

[英]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 中,您可以從執行的進程中訪問returncodestdoutstderr

要捕獲錯誤消息:

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.

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