在python脚本中捕获异常,调用另一个脚本

时间:2014-07-21 03:17:09

标签: python exception

我从另一个python文件运行python脚本。有没有办法可以知道第二个脚本中是否发生了一个eception?

EX:script1.py调用script2.py     python script2。 py -arguments script1如何知道script2中是否发生异常?

run.py

import subprocess

subprocess.call(" python test.py -t hi",shell = True)

test.py

import argparse
print "testing exception"

parser = argparse.ArgumentParser(description='parser')
parser.add_argument('-t', "--test")

args = parser.parse_args()

print args.test
raise Exception("this is an exception")

由于

2 个答案:

答案 0 :(得分:3)

当Python程序抛出异常时,该进程返回非零返回码。像call这样的子流程函数默认会返回返回码。因此,要检查是否发生了异常,请检查非零退出代码。

以下是检查返回码的示例:

    retcode = subprocess.call("python test.py", shell=True)
    if retcode == 0:
        pass  # No exception, all is good!
    else:
        print("An exception happened!")

另一种方法是使用subprocess.check_call,它会在非零退出状态下抛出subprocess.CalledProcessError异常。一个例子:

try:
    subprocess.check_call(["python test.py"], shell=True)
except subprocess.CalledProcessError as e:
    print("An exception occured!!")

如果您需要知道测试程序中发生了哪个异常,可以使用exit()更改异常。例如,在test.py中:

try:
    pass  # all of your test.py code goes here
except ValueError as e:
    exit(3)
except TypeError as e:
    exit(4)

在您的父程序中:

retcode = subprocess.call("python test.py", shell=True)
if retcode == 0:
    pass  # No exception, all is good!
elif retcode == 3:
    pass  # ValueError occurred
elif retcode == 4:
    pass  # TypeError occurred
else:
    pass  # some other exception occurred

答案 1 :(得分:0)

最好的方法可能是使script2成为一个实际的模块,将你想要的东西导入script1,然后使用现有的try / except机制。但也许这不是一个选择?否则我认为从os.system返回的内容可能包括你需要的内容。