Hi,
I am currently working on a custom python tool that works until a certain point. The issue that I am having, and it is probably really simple but I can't seem to trouble shoot, is specifying the feature class using os.path.join method (unless I configured this wrong but running a random test proves otherwise).
The input workspace is set by a created gdb derived from one of the user inputs. Everything works until this point and I am now at a standstill. Any help on this would be greatly appreciated.
import arcpy
Project_GDB = 'input random gdb'
SubBoundaryFC_Name = 'SubdivisionBoundary'
SubdivisionFC = os.path.join(Project_GDB, SubBoundaryFC_Name)
SubBoundary = arcpy.management.FeatureToPolygon(FCs_forSubdivisionBoundary, SubBoundaryFC_Name)
arcpy.AddMessage('{} has been created.'.format(SubBoundary))
Solved! Go to Solution.
Hi @BlakeTerhune,
So I figured out the issue with part of the script that was giving me issues.
#Check to see if the following project already exists. If project exists, overwrite the existing project.
Project_GDB = ''
for root, directory, files in os.walk(folder_location):
GDB = os.path.split(root)[-1]
if GDB == ProjectGDB:
Project_GDB = root
else:
Project_GDB = arcpy.management.CreateFileGDB(folder_location, Project)
Further in the script I converted the output to a string and then utilized the os.path.join which worked as intended.
SubBoundaryFC_Name = 'SubdivisionBoundary'
SubdivisionFC = os.path.join(str(Project_GDB), SubBoundaryFC_Name)
SubBoundary = arcpy.management.FeatureToPolygon(FCs_forSubdivisionBoundary, SubdivisionFC)
arcpy.AddMessage('{} has been created.'.format(SubBoundaryFC_Name))
So this simple solution was really all I needed. Here is the message result that it generated.
SubdivisionBoundary has been created.
I accidently left out of the snippet for this little piece here by mistake.
FCs_forSubdivisionBoundary = []
It is derived from using walk to append each feature class in the database based on matching names.
Are you getting a particular error message? If so, please paste the entire traceback if you can. Is everything in FCs_forSubdivisionBoundary a line or polygon feature class? Also, try using SubdivisionFC as the out_feature_class for FeatureToPolygon() instead of SubBoundaryFC_Name (because no workspace is specified).
Hi @BlakeTerhune,
Here is the error message that I keep getting when it runs.
Failed script Import Test...
Traceback (most recent call last):
File "*:\CAD Exporting Test\Default.tbx#ImportTest_Default.py", line 207, in <module>
File "*:\CAD Exporting Test\Default.tbx#ImportTest_Default.py", line 183, in ScriptTool
File "*:\''\''\AppData\Local\Programs\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\Lib\ntpath.py", line 76, in join
path = os.fspath(path)
TypeError: expected str, bytes or os.PathLike object, not Result
Failed to execute (ImportTest).
Not sure what this error refers to but I can't seem to bypass it for some reason. I am thinking that the issue is either a syntax issue or an output error.
That error means you're taking a Result object (output from a geoprocessing tool) and inputting it directly into something else without unpacking it.
I can't say exactly where it's happening since we don't have the whole script but look on line 183. Something there is getting a result object when it should be getting something more specific (like a string path to a feature class).
Hi @BlakeTerhune,
So I figured out the issue with part of the script that was giving me issues.
#Check to see if the following project already exists. If project exists, overwrite the existing project.
Project_GDB = ''
for root, directory, files in os.walk(folder_location):
GDB = os.path.split(root)[-1]
if GDB == ProjectGDB:
Project_GDB = root
else:
Project_GDB = arcpy.management.CreateFileGDB(folder_location, Project)
Further in the script I converted the output to a string and then utilized the os.path.join which worked as intended.
SubBoundaryFC_Name = 'SubdivisionBoundary'
SubdivisionFC = os.path.join(str(Project_GDB), SubBoundaryFC_Name)
SubBoundary = arcpy.management.FeatureToPolygon(FCs_forSubdivisionBoundary, SubdivisionFC)
arcpy.AddMessage('{} has been created.'.format(SubBoundaryFC_Name))
So this simple solution was really all I needed. Here is the message result that it generated.
SubdivisionBoundary has been created.
It can be tricky trying to troubleshoot script tools but there are some ways you can get error messages.
import arcpy
Project_GDB = 'input random gdb'
try:
SubBoundaryFC_Name = 'SubdivisionBoundary'
SubdivisionFC = os.path.join(Project_GDB, SubBoundaryFC_Name)
# As Brooks mentioned, should SubdivisionFC be FCs_forSubdivisionBoundary below?
SubBoundary = arcpy.management.FeatureToPolygon(FCs_forSubdivisionBoundary, SubBoundaryFC_Name)
arcpy.AddMessage('{} has been created.'.format(SubBoundary))
except:
arcpy.AddError(arcpy.GetMessages(2))
or if you want to test the script in an IDE as a standalone/script tool script and use env.workspace:
import arcpy
Project_GDB = arcpy.GetParametersAsText(0) # value assigned when ran as script tool
if Project_GDB == '' or not Project_GDB:
Project_GDB = 'input random gdb' # default value for standalone
SubBoundaryFC_Name = arcpy.GetParametersAsText(1)
if SubBoundaryFC_Name == '' or not SubBoundaryFC_Name:
SubBoundaryFC_Name = 'SubdivisionBoundary'
try:
arcpy.env.workspace = Project_GDB
# if the target fc's are in the project_gdb, you should be able to reference them by name and not have to use os.path.join if you set your env.workspace
SubBoundary = arcpy.management.FeatureToPolygon("FCs_forSubdivisionBoundary", SubBoundaryFC_Name)
arcpy.AddMessage('{} has been created.'.format(SubBoundary))
except:
arcpy.AddError(arcpy.GetMessages(2))
@Anonymous User has some good suggestions for error handling. I want to point out that the except like that will catch all exceptions but will only attempt to output specifically arcpy geoprocessing errors. A more well rounded solution would be a specific except and a general except for everything else.
import arcpy
Project_GDB = 'input random gdb'
try:
SubBoundaryFC_Name = 'SubdivisionBoundary'
SubdivisionFC = os.path.join(Project_GDB, SubBoundaryFC_Name)
# As Brooks mentioned, should SubdivisionFC be FCs_forSubdivisionBoundary below?
SubBoundary = arcpy.management.FeatureToPolygon(FCs_forSubdivisionBoundary, SubBoundaryFC_Name)
arcpy.AddMessage('{} has been created.'.format(SubBoundary))
except arcpy.ExecuteError:
arcpy.AddError(arcpy.GetMessages(2))
except Exception as e:
arcpy.AddError(e)
I would suggest adding print statements for variables to ensure that they are being populated as expected.