arcpy.Delete_management no elimina una carpeta de geodatabase

8

Este script se ejecuta bien la primera vez pero falla cuando se ejecuta la segunda vez. El problema parece ser que la instrucción KMLToLayer_conversion crea una geodatabase de archivos (no es de extrañar) que posteriormente no se puede eliminar incluso cuando la clase de entidad se elimina del mapa, el archivo de capa y el contenido de la geodatabase se eliminan. Me gustaría limpiar después de mí mismo cuando este script haya terminado con todos los rastros que no sean las nuevas clases de entidad dentro de MasterGDB. El problema es que este script solo se puede ejecutar una vez a menos que salga de ArcMap, elimine manualmente la carpeta en Windows y luego reinicie ArcMap. La ejecución de los comandos individuales dentro de la ventana de Python inevitablemente muestra un "" pero el directorio para la geodatabase permanece. Entonces, ¿qué falta este novato aquí? (En este script de prueba / depuración, solo hay un único archivo KML "C:

import arcpy, os
# Name: BatchKML_to_GDB.py
# Source: AS16818.ZIP from acripts.esri.com


import arcpy, os

# Set local variables and location for the consolidated file geodatabase
KMLDir = "C:\TEMP\KML3"
outLocation = "C:\\Temp\\MuleDeer"
MasterGDB = 'AllKLM5.gdb'
MasterGDBLocation = os.path.join(outLocation, MasterGDB)

# Create the master FileGeodatabase as needed
if not (arcpy.Exists(MasterGDBLocation)):
    print MasterGDBLocation + " doesn't exist; creating it now"
    arcpy.CreateFileGDB_management(outLocation, MasterGDB)

# Convert all KMZ and KML files found in the current workspace    
# Set workspace (where all the KMLs are)
arcpy.env.workspace=KMLDir
for kmz in arcpy.ListFiles('*.KM*'):

  print "CONVERTING: " + os.path.join(arcpy.env.workspace,kmz)
  kmz2 = os.path.join(arcpy.env.workspace,kmz)
  arcpy.KMLToLayer_conversion(kmz2, outLocation)
  print "Done"

# Change the workspace to fGDB location
arcpy.env.workspace = outLocation

# Loop through all the FileGeodatabases within the workspace
wks = arcpy.ListWorkspaces('*', 'FileGDB')
# Drop Master GDB from the array/list
wks.remove(MasterGDBLocation)

for fgdb in wks:  
  # Change the workspace to the current FileGeodatabase
  arcpy.env.workspace = fgdb    

  featureClasses = arcpy.ListFeatureClasses('*', '', 'Palacemarks')
  for fc in featureClasses:
    fcCopy = fgdb + os.sep + 'Placemarks' + os.sep + fc    
    arcpy.FeatureClassToFeatureClass_conversion(fcCopy, MasterGDBLocation, fgdb[fgdb.rfind(os.sep)+1:-4])

arcpy.Delete_management(fcCopy)
arcpy.Delete_management("C:\\Temp\\Muledeer\\KKKLLL.lyr")
arcpy.Delete_management(fgdb)
Tyla
fuente
intente agregar arcpy.env.overwriteOutput = True y del wks, kmz, ... tal vez ayude
user7172
Use RefreshCatalog antes de eliminar la carpeta help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
iRfAn
Gracias por tus comentarios. El "overwriteOutput" en particular es una gema. RefreshCatalog no pareció tener ningún impacto en el tema. Por otro lado, el código original funcionó bien esta mañana, con la nueva línea overwriteOutput. Sospecho que el reinicio del sistema fue parte de la magia (suspiro). Ahora para convertirlo en una versión de producción "del" declaración incluida.
Tyla

Respuestas:

4

Su nivel de ideación debe ser sangrado para:

arcpy.Delete_management(fgdb)

fgdb es un elemento dentro de su ciclo al que no se puede acceder a su referencia como lo tiene ahora.

Tratar:

for fgdb in wks:  
  # Change the workspace to the current FileGeodatabase
  arcpy.env.workspace = fgdb    

  featureClasses = arcpy.ListFeatureClasses('*', '', 'Palacemarks')
  for fc in featureClasses:
    fcCopy = fgdb + os.sep + 'Placemarks' + os.sep + fc    
    arcpy.FeatureClassToFeatureClass_conversion(fcCopy, MasterGDBLocation, fgdb[fgdb.rfind(os.sep)+1:-4])

  arcpy.Delete_management(fgdb)

arcpy.Delete_management(fcCopy)
arcpy.Delete_management("C:\\Temp\\Muledeer\\KKKLLL.lyr")
artwork21
fuente
-2

Descubrí que la siguiente llamada de eliminación se completa correctamente.

if arcpy.Exists(fcName):
   arcpy.Delete_management(fcName)
sandyc
fuente
2
No estoy seguro de cómo responde esto a la pregunta del OP.
Devdatta Tengshe
1
Agregar la if arcpy.Existsparte no hace Delete_managementque funcione si ya está fallando por alguna razón. (Solo lo probé y verifiqué)
Erica