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!