AnsweredAssumed Answered

how do you return a file GDB from a python-tool based geoprocessing service

Question asked by tomrip on Nov 4, 2014



I have created a python tool which

1) creates a new file geodatabase

2) extracts data from a Map Service via a REST call

3) creates a feature class in the fGDB created in step 1 via the JSONtoFeatures tool.


The tool works as expected when running ArcCatalog or ArcMap. I can publish the tool as a geoprocessing service with no problems, and then make calls against the GP service with no errors.  If I publish the service as a synchronous process and then use the Services Directory browser to execute a task, I get a bunch of messages saying that everything was processed without error. However, the fGDB is not returned.  If i publish the service as an asynch process and then submit the job, the "completed job" response gives me a URL, but when i browse to the URL, the response back is 'Invalid URL'.


In both cases (synch and asych), i can get on the server hosting the Service and see that the fGDB was created at the location i set for the arcpy,env.workspace (set as part of the execute method).  If i don't set arcpy.env.workspace, the script wont run as tool.


What step(s) or settings(s) am I missing to have the GP service return the file geodatabase?


Thank you.


parameter definition

    def getParameterInfo(self):         """Define parameter definitions"""          # Output Type         param0 = arcpy.Parameter(         displayName="Output type",         name="output_type",         datatype="GPString",         parameterType="Required",         direction="Input")          param0.filter.type = "ValueList"         param0.filter.list = ['fGDB', 'pGDB']          param1 = arcpy.Parameter(         displayName="Test Service Layer URL",         name="test_service_layer_url",         datatype="GPString",         parameterType="Required",         direction="Input")         param1.value = "http://xx.xx.xx.xx/arcgis/rest/services/testservice/MapServer/0"          param2 = arcpy.Parameter(         displayName="Code",         name="code",         datatype="GPString",         parameterType="Required",         direction="Input")         param2.value = "07040008"          param3 = arcpy.Parameter(         displayName="Source Field",         name="source_field",         datatype="GPString",         parameterType="Required",         direction="Input")         param3.value = "data_field_1"          param4 = arcpy.Parameter(         displayName="Output File",         name="outFile",         datatype="DEFile",         parameterType="Derived",         direction = "Output")          params = [param0, param1, param2, param3, param4]         return params




and the execute definition:

   def execute(self, parameters, messages):         try:                out_type = parameters[0].valueAsText.lower()              service_url = parameters[1].valueAsText             o = urlparse(service_url)             if not"/\d+$", o.path):                 raise InputParameterError("Missing expected layer index at the end of the input parameter 'Test Service Layer URL'.")             query_url = service_url + "/query"              Code = parameters[2].valueAsText             where_clause = "data_field_2 = '" + huc8Code + "'"              data_field = parameters[3].valueAsText             outfields = []             outfields.append(data_field )              arcpy.env.workspace = r"C:\arcgisserver\directories\arcgisjobs\exportdata_gpserver"             out_folder_path = arcpy.env.workspace             messages.addMessage("output folder: " + out_folder_path)             out_name = ""             json_out_folder_path = arcpy.env.workspace             json_out_name = prependTimeStamp("output.json")                         out_fcName = data_field             messages.addMessage("output FC name: " + out_fcName)             messages.addMessage("output JSON name: " + json_out_name)                         if out_type == 'pgdb':                 out_name = prependTimeStamp("testPGDB.mdb")                 arcpy.CreatePersonalGDB_management(out_folder_path, out_name)             elif out_type == 'fgdb':                 out_name = prependTimeStamp("testFGDB.gdb")                 arcpy.CreateFileGDB_management(out_folder_path, out_name)              payload = {'where': where_clause, 'outfields': ', '.join(outfields), 'f':'pjson'}              with open(os.path.join(json_out_folder_path,json_out_name), 'wb') as handle:                 response = requests.get(query_url, params=payload, stream=True)                 print (response.status_code)                 for block in response.iter_content(1024):                     if not block:                         break                     handle.write(block)             arcpy.JSONToFeatures_conversion(json_out_name, os.path.join(out_name,out_fcName))              arcpy.SetParameter(4, os.path.join(out_folder_path, out_name))          except Exception as e:             arcpy.AddError(e)         return