.pyc tool cannot find earlier output

2352
4
Jump to solution
04-11-2016 10:05 AM
deleted-user-mGKzsOLEnzmy
New Contributor II

Creating a python toolbox using the ESRI .pyt format. This tool is very straight forward (at least in theory) in that one polygon input generates three outputs: a convex hull layer for the input polys, a centroid layer for the input polys, and an intersection of the convex hull and centroids.

    def execute(self, parameters, messages):
        """Execute linear orientation analysis."""
        input = parameters[0].valueAsText
        baseName = arcpy.Describe(input).baseName
                
        arcpy.env.workspace = arcpy.Describe(input).catalogPath
        
        #overwrite doesn't work, tool still fails if output already exists
        arcpy.env.overwriteOutput = True
        
        #output names
        mbg = "{0}_MBG".format(baseName)
        cents = "{0}_centroids".format(baseName)
        intersectOutput = "{0}_MBG_Intersect".format(baseName)
                        
        #output
        arcpy.MinimumBoundingGeometry_management(input,
                                                 mbg,
                                                 "CONVEX_HULL",
                                                 "NONE", "#",
                                                 "MBG_FIELDS")
        arcpy.FeatureToPoint_management(input, 
                                        cents,
                                        "INSIDE")
        
        arcpy.Intersect_analysis(in_features = [mbg, cents],
                                 out_feature_class = intersectOutput,
                                 join_attributes = "ALL", 
                                 cluster_tolerance = "-1 Unknown", 
                                 output_type="INPUT")
        return

Stack trace on the error seems to indicate that arcpy.Intersect_Analysis cannot find the feature classes generated by MinimumBoundingGeometry and FeatureToPoint that the script just created:

Traceback (most recent call last):

  File "<string>", line 111, in execute

  File "c:\program files (x86)\arcgis\desktop10.3\arcpy\arcpy\analysis.py", line 289, in Intersect

    raise e

ExecuteError: Failed to execute. Parameters are not valid.

ERROR 000732: Input Features: Dataset C:\GISData\scratch\acir_runs\Hernando_Fuzzy2.gdb\Mines\Mines_MBG #;C:\GISData\scratch\acir_runs\Hernando_Fuzzy2.gdb\Mines\Mines_centroids # does not exist or is not supported

Failed to execute (Intersect).

Commenting out lines 26-30 produces viable output from the MBG and F2P tools.

Anybody run into this one before? Am I missing something obvious - perhaps scoping issues - inherent to .pyc toolboxes/classes, or this is another instance of arcpy $#!^ing the bed?

0 Kudos
1 Solution

Accepted Solutions
deleted-user-mGKzsOLEnzmy
New Contributor II

Finally got it to work by carefully formatting the fully qualified path names.

    def execute(self, parameters, messages):
        """Execute linear orientation analysis."""
        input = parameters[0].valueAsText
       
        baseName = arcpy.Describe(input).baseName
       
        basePath = os.path.split(arcpy.Describe(input).catalogPath)[0]               
        arcpy.env.workspace = basePath
       
        #overwrite doesn't work, tool still fails if output already exists
        arcpy.env.overwriteOutput = True
       
        #output names
        mbg = "{0}_MBG".format(baseName)
        cents = "{0}_centroids".format(baseName)
        intersectOutput = "{0}_MBG_Intersect".format(baseName)
       
        #output
        arcpy.MinimumBoundingGeometry_management(input,
                                                mbg,
                                                "CONVEX_HULL",
                                                "NONE", "#",
                                                "MBG_FIELDS")
        arcpy.FeatureToPoint_management(input,
                                        cents,
                                        "INSIDE")     


        #=======================================================================
        arcpy.Intersect_analysis(in_features = [r'{0}\\{1}'.format(basePath, mbg),r'{0}\\{1}'.format(basePath, cents)],
                                out_feature_class = intersectOutput,
                                join_attributes = "ALL",
                                cluster_tolerance = "-1 Unknown",
                                output_type="POINT")
        #=======================================================================


        return

Nothing I tried using single slashes worked, the intersect tool apparently needed '\\' regardless of whether or not you passed a raw string using 'r' or not. How obscure is that...

View solution in original post

0 Kudos
4 Replies
DanPatterson_Retired
MVP Emeritus

throw in a print statement to check the input and output names and append the catalogpath if you have to

deleted-user-mGKzsOLEnzmy
New Contributor II

Tried that, along with some other basic debugging trying to tackle basic issue like this. Still no joy, even with the fully qualified path names to the feature classes. I also tried enclosing the intersect call within its own function outside of def execute and passing the parameters to a seperate function; that did not work, either.

Running Intersect manually on the two outputs afterwards works fine, however; no problems there.

0 Kudos
RebeccaStrauch__GISP
MVP Emeritus

I would check  you "in_features = [mbg, cents]"    seems that is the issue and maybe not quite the correct format that is wants in  script.

Intersect—Help | ArcGIS for Desktop

deleted-user-mGKzsOLEnzmy
New Contributor II

Finally got it to work by carefully formatting the fully qualified path names.

    def execute(self, parameters, messages):
        """Execute linear orientation analysis."""
        input = parameters[0].valueAsText
       
        baseName = arcpy.Describe(input).baseName
       
        basePath = os.path.split(arcpy.Describe(input).catalogPath)[0]               
        arcpy.env.workspace = basePath
       
        #overwrite doesn't work, tool still fails if output already exists
        arcpy.env.overwriteOutput = True
       
        #output names
        mbg = "{0}_MBG".format(baseName)
        cents = "{0}_centroids".format(baseName)
        intersectOutput = "{0}_MBG_Intersect".format(baseName)
       
        #output
        arcpy.MinimumBoundingGeometry_management(input,
                                                mbg,
                                                "CONVEX_HULL",
                                                "NONE", "#",
                                                "MBG_FIELDS")
        arcpy.FeatureToPoint_management(input,
                                        cents,
                                        "INSIDE")     


        #=======================================================================
        arcpy.Intersect_analysis(in_features = [r'{0}\\{1}'.format(basePath, mbg),r'{0}\\{1}'.format(basePath, cents)],
                                out_feature_class = intersectOutput,
                                join_attributes = "ALL",
                                cluster_tolerance = "-1 Unknown",
                                output_type="POINT")
        #=======================================================================


        return

Nothing I tried using single slashes worked, the intersect tool apparently needed '\\' regardless of whether or not you passed a raw string using 'r' or not. How obscure is that...

0 Kudos