2 votos

La clase de característica puede estar bloqueada en ArcPy

Tengo un script que recorta 20 clases de características y elimina el "archivo de recorte" (fcin). Mi problema es que el script falla en 3 de las clases de características con el error "Puede estar bloqueado por otra aplicación" cuando intenta eliminar el fcin. He intentado usar testschemalock para que sólo se borre si el script puede conseguir el bloqueo del esquema pero no hay diferencia. Ahora he intentado desconectar todos los usuarios y el nuevo espacio de trabajo. Entonces me sale un error de que el fcin no existe. Ahora no tengo ni idea de qué hacer. Hice un último intento de poner un bucle while en el nuevo espacio de trabajo después de desconectar todos los usuarios, pero luego se quedó atascado en el bucle (arcpy.Exists) porque no puede encontrar el archivo (el archivo existe). Es sólo en las mismas clases de características en las que falla. Cuando compruebo las conexiones no hay nadie conectado a la base de datos SQL.

Intenté averiguar si había algún problema con las clases de características pero no hubo resultado. Si ejecuto el script original tengo que cerrar Python antes de borrar la feature class manualmente.

Creo que fue cuando actualizamos a 10.5.1 cuando el script empezó a fallar.


Acabo de intentar hacer hardcode con una clase de característica que falla y sigue fallando. De alguna manera deben ser las clases de características pero no tengo ni idea de por qué.. Después de que el script trata de eliminar el clip en el archivo y falla, mueve el clip en el archivo a la raíz de la base de datos. Si sólo utilizo el delete.management y me salto el clip del archivo antes de que funcione. Así que es posible eliminar el archivo con ArcPy pero falla si recorto el archivo antes.

connection = 'connectionfile.sde'

arcpy.env.workspace = connection
arcpy.env.workspace = connection + '\\' + 'map_zone2'

arcpy.Clip_analysis('clip_in_file', 'clip_file_zone2', 'clip_out_file_zone2')
arcpy.Delete_management('clip_in_file')

ERROR 000601: Cannot delete clip_in_file.  May be locked by another application.
Layer in use [clip_in_file]
Failed to execute (Delete).
Failed at Fri Oct 18 08:20:32 2019 (Elapsed Time: 0,65 seconds)

Código con bucle while

arcpy.Clip_analysis('clip_in_file', 'clip_file_zone2', 'clip_out_file_zone2')

print 'Disconnect all user'
arcpy.DisconnectUser(connectionsde, 'ALL')
arcpy.ClearWorkspaceCache_management()
print 'New connect'
arcpy.env.workspace = connection
arcpy.env.workspace = connection + '\\' + 'map_zone2'

while not arcpy.Exists(clip_in_file):
    print 'New connect 2'
    arcpy.ClearWorkspaceCache_management()
    arcpy.env.workspace = connection
    arcpy.env.workspace = connection + '\\' + 'map_zone2'
    time.sleep(5)

print 'Delete clip in file'
arcpy.Delete_management('clip_in_file')

1voto

P.N.Reddy Puntos 51

No estoy seguro de que hayas descubierto la causa, pero tuve problemas similares al intentar realizar tareas de geoprocesamiento consecutivas en los mismos datos. ArcPy intentaba procesar la segunda tarea antes de que la primera tarea hubiera liberado correctamente su bloqueo de datos. Mi solución fue pausar el script entre tareas con time.sleep(1). Esto permitía a la primera tarea liberar correctamente el bloqueo antes de proceder a la siguiente tarea de geoprocesamiento. Puede que valga la pena probarlo en tu caso para ver si el comportamiento cambia.

0voto

Techdragon Puntos 21

Eso fue lo primero que pensé, pero el script sólo libera el bloqueo si se sale del proceso. No sirvió para dormir, desconectar a todos los usuarios, etc. Encontré una forma de solucionar el problema. Ahora uso un subproceso para recortar la clase de característica y un bucle while not con arcpy.TestSchemaLock para esperar hasta que el proceso de recorte termine antes de que el script borre el "in feature class".


He utilizado subprocess.Popen. Descubrí que si uso subprocess.call no tengo que usar el bucle while para testschemalock porque cuando uso subprocess.call los scripts esperan hasta que el subproceso termine antes de ejecutar la función de borrado.

0voto

aop7 Puntos 11

Yo también experimenté el mismo problema. El código funcionaba bien y lo probé con un nuevo archivo y recibí el mismo mensaje de error. Me di cuenta de que era un problema con la geometría de una línea que estaba tratando de rasterizar. (También la razón por la que estaba tratando de rasterizarlo) De mi investigación hay muchas otras razones por las que puede recibir este error.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X