如何捕获子进程错误

时间:2014-03-23 02:07:28

标签: python subprocess

在Python中,我运行使用FORTRAN制作的exe。我使用subprocess模块。 exe访问和写入几个文件。如果我只读取这些文件,我会在Python控制台中看到以下跟踪。

我尝试使用tryexcept语句。但我无法捕捉错误。我也尝试过使用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

3 个答案:

答案 0 :(得分:3)

运行流程:

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 :(得分: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)
编辑:正如mgilson在另一个答案中指出的那样,这需要在失败时返回非零的返回码。如果情况并非如此,您可以尝试以下方式:

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

带有一些字符串,只有在出现错误时才会出现在stdout上

答案 2 :(得分:1)

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