import arcpy class Toolbox(object): def __init__(self): """Define the toolbox (the name of the toolbox is the name of the .pyt file).""" self.label = "Toolbox" self.alias = "" # List of tool classes associated with this toolbox self.tools = [Tool] class Tool(object): def __init__(self): """Define the tool (tool name is the name of the class).""" self.label = "Tool" self.description = "" self.canRunInBackground = False def getParameterInfo(self): """Define parameter definitions""" a = arcpy.Parameter( displayName = 'a', name = 'a', datatype = 'GPLong', parameterType = 'Required', direction = 'Input' ) b = arcpy.Parameter( displayName = 'b', name = 'b', datatype = 'GPLong', parameterType = 'Required', direction = 'Input' ) total = arcpy.Parameter( displayName = 'Total', name = 'total', datatype = 'GPLong', parameterType = 'Derived', direction = 'Output' ) # Set defaults a.value = 100 b.value = 200 params = [a, b, total] return params def isLicensed(self): """Set whether tool is licensed to execute.""" return True def updateParameters(self, parameters): """Modify the values and properties of parameters before internal validation is performed. This method is called whenever a parameter has been changed.""" return def updateMessages(self, parameters): """Modify the messages created by internal validation for each tool parameter. This method is called after internal validation.""" return def execute(self, parameters, messages): """The source code of the tool.""" # Print all parameters before any changes are made ndx = 0 for p in parameters: arcpy.AddMessage('parameters[%d].valueAsText: %s'% (ndx, p.valueAsText)) arcpy.AddMessage('arcpy.GetParameterAsText(%d): %s' % (ndx, arcpy.GetParameterAsText(ndx))) ndx += 1 arcpy.AddMessage('=' * 50) # Set the output parameter total = int(parameters[0].valueAsText) + int(parameters[1].valueAsText) arcpy.SetParameterAsText(2, total) # Print all parameters again ndx = 0 for p in parameters: arcpy.AddMessage('parameters[%d].valueAsText: %s'% (ndx, p.valueAsText)) arcpy.AddMessage('arcpy.GetParameterAsText(%d): %s' % (ndx, arcpy.GetParameterAsText(ndx))) ndx += 1 return
Is there a particular reason that you are using the python toolbox vs. using the esri template interface?
Hi Kevin,
It's as simple as this:
import arcpy # Fetch input values a = arcpy.GetParameter(0) b = arcpy.GetParameter(1) # Perform calculation total = a + b # Return the result arcpy.SetParameter(2, total)
And the parameters for the accompanying script tool look like this:
When I do that I see my output correctly in the results window in arcmap, but after publishing as a gp service I'm not sure how to get the results in from the rest directory. I get an error FAILED from the submit job screen on the rest directory.
Try turning on debug messages in the GP service and running again:
FAILED... I just want to let my web developer get back 'Hello world' when calling this
Job Messages:
Here's the code. Not much happening here.
import arcpy import os class Toolbox(object): def __init__(self): self.label = "Get Nearby Addresses" self.alias = "" # List of tool classes associated with this toolbox self.tools = [GetNearbyAddresses] class GetNearbyAddresses(object): def __init__(self): self.label = "Get Nearby Addresses" self.description = "Get Nearby Addresses within a buffer." self.canRunInBackground = False def getParameterInfo(self): params = [] param0 = arcpy.Parameter( displayName = "Latitude", name = "lat", datatype = "Double", parameterType = "Required", direction = "Input") params.append(param0) param1 = arcpy.Parameter( displayName = "Longitude", name = "lon", datatype = "Double", parameterType = "Required", direction = "Input") params.append(param1) param2 = arcpy.Parameter( displayName = "Buffer Distance", name = "distance", datatype = "Long", parameterType = "Required", direction = "Input") params.append(param2) param3 = arcpy.Parameter( displayName = "Address List", name = "addresses", datatype = "GPString", parameterType = "Derived", direction = "Output") params.append(param3) return params def execute(self, parameters, messages): try: #arcpy.env.workspace = r'E:\gis\ims\20141028_getAddressesWithinBuffer\default.gdb' #arcpy.env.overwriteOutput = True lat = parameters[0].valueAsText lon = parameters[1].valueAsText distance = parameters[2].valueAsText #inpoint = arcpy.Point(X=lon, Y=lat) #ptGeometry = arcpy.PointGeometry(inpoint, arcpy.SpatialReference(4326)) #arcpy.Buffer_analysis(ptGeometry, 'buffer', distance + ' FEET', \ #"FULL", "ROUND", "NONE", "") #print 'made the buffer.' #get intersecting addresses #parameters[3].value = 'laksdjflaskdjflksajdf' arcpy.SetParameter(3,'Hello World!') return except Exception, ErrorDesc: sErr = "ERROR:\n" + str(ErrorDesc) messages.addErrorMessage(sErr) return
Your code works when I publish it to my server. You should be seeing more detail in the error message. There is probably a Python exception being thrown somewhere (not just esriJobMessageTypeError) . Can you confirm that you set Message Level to Error?
Thanks for testing. I'm failing on a 10.1 server, but my 10.2 server succeeds!