如何捕捉子进程错误

问题描述 投票:3回答:3

在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
python subprocess
3个回答
6
投票

运行该进程。

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

1
投票

如果不需要Popen的所有功能,而只需要获取stdout,你也可以选择..:

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)

EDIT: 正如mgilson在另一个答案中指出的,这需要一个非零的返回代码。如果不是这样的话,你可以试试类似这样的方法。

output = subprocess.check_output('C:\\TGSSR\\test.exe')
if "permission to access file denied" in output:
    print("Failed")

用一些只有在出错时才会出现在stdout上的字符串。


0
投票

Python 3.5引入了 subprocess.run() 方法。

下面是@kirbyfan64sos针对Python >=3.5更新的答案。

运行这个过程。

p = subprocess.run(['C:\\TGSSR\\test.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

在 >=3.5 中,你可以访问 returncode, stdoutstderr 从执行的进程中获取。

要捕捉错误信息。

stdout = p.stdout # stdout = normal output
stderr = p.stderr # stderr = error output

检查进程返回代码

if p.returncode != 0:
# handle error
© www.soinside.com 2019 - 2024. All rights reserved.