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?
I'd love to see how your fixed code looks!
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!