在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
答案 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中,您可以从已执行的进程访问returncode
,stdout
和stderr
。
要捕获错误消息:
stdout = p.stdout # stdout = normal output
stderr = p.stderr # stderr = error output
检查流程返回码:
if p.returncode != 0:
# handle error