Answers:
请参见无法摆脱对用Python脚本创建的文件地理数据库和要素类的锁定。看起来像是同样的问题。我之前通过明确删除要素类来解决它。我不确定这是否在所有情况下都有效。
import arcpy
fcPath = 'c:/temp/features.shp'
idFld = 'OBJECTID'
cur = arcpy.SearchCursor(fcPath)
for row in cur:
id = row.getValue(idFld)
row = None
cur = None
r = arcpy.Delete_management(fcPath)
print r.getOutput(0)
强制进行垃圾回收也可能有效,但我的直觉是这与arcpy或ArcMap的内部工作有关。
import gc
gc.collect()
row = None
您是否需要从ArcMap内部运行ArcPy脚本?除非它是已构建的接口或工具箱的一部分,否则可以从Python控制台,IDLE或Eclipse等在ArcMap外部运行它(只要您在运行它的计算机上拥有适当的许可证)即可。在这种情况下,您可以编写一些Python代码来将ArcPy脚本作为子进程生成,并且应该在子进程关闭时释放锁定。
ArcGIS锁很麻烦。我曾经遇到过这样的情况,即使关闭机器后,锁仍然存在,这是一个巨大的痛苦(通常,如果Arc在它可以收起锁之前崩溃了)。万一发生这种情况,请使用Windows资源管理器查找.LOCK文件并手动将其删除。如果ArcMap或Python进程正在访问它,它将无法正常工作,因此它相对安全...但是这实际上是一张越狱卡,不是一种好习惯:)
如果您同时删除了行和光标对象(例如del row, rows
),并且仍然保留了锁定,则可能是因为ArcMap本身(不是arcpy)仍在引用它。
shapefile是由目录中的图层引用的还是由脚本工具添加到TOC的?
如果是后者,则可以尝试在ArcMap中的“ 地理处理”-> “ 地理处理选项”下禁用“将地理处理操作的结果添加到显示中”。
另一个建议:如果您是作为临时/中间数据集进行操作,并且要素的数量不是太大,请尝试使用in_memory
工作空间而不是shapefile来完全解决锁定问题,并获得不错的潜在性能提升。
只需确保在退出脚本之前使用删除(数据管理)删除in_memory工作空间或在其中创建的特定数据集,否则它将继续驻留在内存中,直到应用程序关闭。
最后,我还要指出的是,在从目录中删除图层时,通过不删除锁定文件,shapefile锁定行为在10.0中已变得更加严格。另请参阅本文和相关问题。