How can I get a geoprocessing service to return a file?
I published a GP
if __name__ == '__main__': file = open(arcpy.env.scratchWorkspace+ "/" + "test.txt","w") file.write("why") file.close() arcpy.SetParameter(0, file.name)
however i kept receiving the
I can see the file in the scratch folder but i need to return the file some how.
I did try to access the file via different permutation of
Can someone kindly assist.
Solved! Go to Solution.
I had rewritten the code several times
txtFile = os.path.join(arcpy.env.scratchFolder, "myTxt.txt")
f = open(txtFile, 'w')
One of them is as shown above, still the same .
I have arcgis enterprise installed locally, would that have made a difference?
My apologies, I had so many tabs opened and I must have copy and paste from the wrong tab
txtFile = os.path.join(arcpy.env.scratchFolder, "myTxt.txt") f = open(txtFile, 'w') f.writelines("huh") f.close arcpy.SetParameterAsText(0, txtFile)
Superseded by my comment above but still useful! To answer your original question, to return your output file parameter (in Pro) wrap the web tool in a model and add the Copy geoprocessing tool to copy it into your project. The file has to be a supported type. Here is an example where the web tool is a Spatial ETL tool which I featured in my recent UC technical workshop on Data Interoperability extension. The experience of a web tool output going to a rather obscure profile directory is under review by geoprocessing team. Note: The intermediate scratchfile will be deleted when you exit Pro, this is also under review.
Thank you all for your help. It turns out I have been really silly.
I kept attempting to access the file via "arcgis/rest/services/
where else the output of the directory is actually on arcgis/rest/directories/arcgisjobs
For further reader, here's a sample geoprocessing toolbox with a tool that returns a file.
- Your parameter file must have a "direction" of "Output" and a "parameterType" of "Derived"
- The file type for geoprocessing parameter is "DEFile", for some reason "GPDataFile" results in no file being accessible to end user. Once published it appears as "GPDatafile"
- Result must be set via arcpy.setParameterAsText whereas setting "value" of a saved parameter does nothing.
- In order to be accessible you file must be wrote/saved to "arcpy.env.scratchFolder". Arcpy rewrite this path once published to an accessible URL.
- If you wish to backup your file outside of "arcpy.env.scratchFolder" you have to register the save location, from ArcGIS Pro: add any folder you need via: Share→Manage→Data stores, here add a new `folder` with `Publish folder path` set to the path you want to expose. Keep in mind that any hard coded path will be consolidated (to a sandbox path) on publish by ArcGIS.
# -*- coding: utf-8 -*- import arcpy from os.path import join class Toolbox(object): def __init__(self): """Sample file toolbox""" self.label = "Sample file toolbox" self.alias = "File toolbox" # List of tool classes associated with this toolbox self.tools = [GetFileTool] class GetFileTool(object): def __init__(self): """Define the tool (tool name is the name of the class).""" self.label = "Get file tool" self.description = "A tool to get a file" self.canRunInBackground = False def getParameterInfo(self): """Define parameter definitions""" return [arcpy.Parameter(displayName="Output_File", name='Output_File', datatype=['DEFile'], parameterType='Derived', direction='Output')] 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 exitWithError(self,msg): """ exit geoprocessing with a given error msg under the hood it raise an exception, msg is logged as error """ raise ValueError(msg) def execute(self, parameters, messages): """The source code of the tool.""" p = join(arcpy.env.scratchFolder, "test.txt") with open(p, 'w') as f: f.write('hello') #set result with SetParameterAsText, setting result via 'value' parameter of objects inside parameters does nothing arcpy.SetParameterAsText(0,p)