Looking for advice and discussion on implementing script tools.
I have been adopting the convention where my script tools are embedded a functions. Here is my generic template:
import os import sys import traceback import arcpy from arcpy import env class MsgError(Exception): pass def MyTool(args): """Enter python docstring here """ # init cursor variables Row, Rows = [None] * 2 # init temp file variables lyr1,tmp1 = [None] * 2 try: # tool code here pass except MsgError as xmsg: arcpy.AddError(xmsg)) except arcpy.ExecuteError: tbinfo = traceback.format_tb(sys.exc_info()) arcpy.AddError(tbinfo.strip()) numMsg = arcpy.GetMessageCount() for i in range(0, numMsg): arcpy.AddReturnMessage(i) except Exception as xmsg: tbinfo = traceback.format_tb(sys.exc_info()) arcpy.AddError(tbinfo + str(xmsg)) finally: # temp files for f in [lyr1, tmp1]: if f: try: arcpy.Delete_management(f) except: pass if __name__ == "__main__": # ArcGIS Script tool interface # Get arguments, call tool argv = tuple(arcpy.GetParameterAsText(i) for i in range(arcpy.GetArgumentCount())) MyTool(*argv)
The issue I'm running into is when I use this tool in another script and import it directly instead of going through ImportToolbox (for performance reasons), for example
from rastertools import MyTool ... MyTool(arg1, arg2)
And the tool fails with an error, my calling script does not stop because i handled it. I want my calling script to bail in this situation.
Is the following approach valid? I'm assuming that if MyTool failed I will get a response from arcpy.GetMessages(2) since I called arcpy.AddError() in the called function.
MyTool(arg1, arg2) if arcpy.GetMessages(2): raise Exception("Geoprocessing tool MyTool failed")
Should I be using ImportToolbox to get my script tool instead of this more direct import of my tool function?