在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
如果不需要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上的字符串。
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
, stdout
和 stderr
从执行的进程中获取。
要捕捉错误信息。
stdout = p.stdout # stdout = normal output
stderr = p.stderr # stderr = error output
检查进程返回代码
if p.returncode != 0:
# handle error