ArcGIS Python SearchCursor文件锁定?


11

我有一个脚本,该脚本从shapefile的字段获取值以返回给用户。

似乎只有当arcpy.SearchCursor称为ArcMap 10.0时,该文件才会锁定,并且在脚本运行完成后不会将其删除。要解除锁定,我必须关闭ArcMap。在脚本中,我在使用SearchCursor对象以及行对象后将其删除。

我使用脚本的方式是它尝试在后续运行中删除工作空间文件夹,但是由于锁定而无法执行……直到我关闭ArcMap。

有什么建议可以让这个锁消失吗?

Answers:


4

从以下位置解决问题后:

rows = arcpy.UpdateCursor(fc)   
delete = rows.deleteRow  
for row in rows:  
    delete(row)  
del row  
del rows

rows = arcpy.UpdateCursor(fc)
for row in rows:
    rows.deleteRow(row)
del row
del rows

3

请参见无法摆脱对用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()

我对此进行了编辑,因为在每次游标迭代之后都应删除行引用,否则循环外的调用是多余的。这也是我投赞成票的唯一途径,当我遇到同样的问题时,它是解决该问题的唯一方法。
毛的2012年

@头发好,但是我认为这是一个沉默点。当将新的行对象分配给row 变量时,Python会在每次迭代时减少对上一个行对象的引用。 循环之后,只需清除最后一行的分配。在循环中移动它是重复的工作。无论如何,除非arcpy或ArcMap内部维护对行对象的引用,否则垃圾收集器应释放内存。row = None
塔伦2012年

同意不同意是确定的,还是有争议的。我知道arcpy中的垃圾回收是有缺陷的,并且如果将其关闭,实际上会更快。至于该行被设置为空,我知道这样做更好。有人会说什么都不做是多余的,但事实并非如此。可以在脚本开始时关闭垃圾收集,并测量时间差。我也使用了del row,而不是row = none,但这是另一个问题:尝试导入gc gc.disable()
毛的

@Hairy,我没想到要禁用gc。我会尝试的。
塔伦2012年

这对我不起作用,因为我需要要素类。另外,我后来在另一个要素类上获得了一个UpdateCursor,并且也被锁定了。我最终使用镜子和巧妙的技巧到达需要的位置。不知道它将持续多久。谢谢。
贾斯汀

1

您是否需要从ArcMap内部运行ArcPy脚本?除非它是已构建的接口或工具箱的一部分,否则可以从Python控制台,IDLE或Eclipse等在ArcMap外部运行它(只要您在运行它的计算机上拥有适当的许可证)即可。在这种情况下,您可以编写一些Python代码来将ArcPy脚本作为子进程生成,并且应该在子进程关闭时释放锁定。

ArcGIS锁很麻烦。我曾经遇到过这样的情况,即使关闭机器后,锁仍然存在,这是一个巨大的痛苦(通常,如果Arc在它可以收起锁之前崩溃了)。万一发生这种情况,请使用Windows资源管理器查找.LOCK文件并手动将其删除。如果ArcMap或Python进程正在访问它,它将无法正常工作,因此它相对安全...但是这实际上是一张越狱卡,不是一种好习惯:)


1

如果您同时删除了行和光标对象(例如del row, rows),并且仍然保留了锁定,则可能是因为ArcMap本身(不是arcpy)仍在引用它。

shapefile是由目录中的图层引用的还是由脚本工具添加到TOC的?

如果是后者,则可以尝试在ArcMap中的地理处理”-> 地理处理选项下禁用“将地理处理操作的结果添加到显示中”

另一个建议:如果您是作为临时/中间数据集进行操作,并且要素的数量不是太大,请尝试使用in_memory工作空间而不是shapefile来完全解决锁定问题,并获得不错的潜在性能提升。

只需确保在退出脚本之前使用删除(数据管理)删除in_memory工作空间或在其中创建的特定数据集,否则它将继续驻留在内存中,直到应用程序关闭。

最后,我还要指出的是,在从目录中删除图层时,通过不删除锁定文件,shapefile锁定行为在10.0中已变得更加严格。另请参阅本文相关问题


绝对是ArcMap。我认为调用游标会杀死以前的游标锁。我在fc上调用SearchCursor,然后在另一个fc上调用UpdateCursor,先前的锁定消失了。我可能会在文件上调用thrid虚拟游标,该文件不需要删除就可以处理死锁黑匣子样式。谢谢。
贾斯汀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.