Sperren von ArcGIS Python SearchCursor-Dateien?

11

Ich habe ein Skript, das einen Wert aus dem Feld eines Shapefiles erhält, um zum Benutzer zurückzukehren.

Es scheint, dass nur wenn der arcpy.SearchCursor ArcMap 10.0 heißt, die Datei gesperrt wird und sie nicht entfernt wird, nachdem das Skript ausgeführt wurde. Um die Sperre aufzuheben, muss ich ArcMap schließen. Im Skript lösche ich das SearchCursor-Objekt nach der Verwendung sowie das Zeilenobjekt.

Das Skript funktioniert so, dass es versucht, den Arbeitsbereichsordner bei nachfolgenden Ausführungen zu löschen, dies jedoch aufgrund der Sperre nicht möglich ist ... bis ich ArcMap natürlich schließe.

Gibt es einen Rat, wie man dieses Schloss aufheben kann?

Justin
quelle

Antworten:

4

Das Problem wurde gelöst nach:

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

zu

rows = arcpy.UpdateCursor(fc)
for row in rows:
    rows.deleteRow(row)
del row
del rows
b.bacia
quelle
3

Siehe Sperre für Datei-Geodatabase und Feature-Class, die in Python-Skript erstellt wurden, kann nicht aufgehoben werden . Es sieht aus wie das gleiche Problem. Ich habe es schon einmal umgangen, indem ich die Feature-Class explizit gelöscht habe. Ich bin mir nicht sicher, ob dies in allen Fällen funktionieren wird.

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)

Das Erzwingen einer Speicherbereinigung kann ebenfalls funktionieren, aber meine Vermutung ist, dass dies etwas mit der internen Funktionsweise von arcpy oder ArcMap zu tun hat.

import gc
gc.collect()
Tharen
quelle
Ich habe dies bearbeitet, da die Zeilenreferenz nach jeder Iteration des Cursors entfernt werden sollte, da sonst der Aufruf außerhalb der Schleife überflüssig ist. Dies ist auch eine, für die ich gestimmt habe, da dies die einzige Möglichkeit ist, das gleiche Problem zu umgehen, als ich es hatte.
Haarige
@Hairy OK, aber ich denke, es ist ein stummer Punkt. Python dekrementiert die Verweise auf das vorherige Zeilenobjekt bei jeder Iteration, wenn der Zeilenvariablen ein neues Zeilenobjekt zugewiesen wird . row = NoneNach der Schleife wird einfach die letzte Zeilenzuordnung bereinigt. Das Verschieben innerhalb der Schleife ist eine doppelte Anstrengung. In jedem Fall sollte der Garbage Collector den Speicher freigeben, es sei denn, arcpy oder ArcMap verwaltet intern einen Verweis auf die Zeilenobjekte.
Tharen
Es ist in Ordnung zuzustimmen, nicht zuzustimmen, oder es ist ein strittiger Punkt. Ich weiß, dass die Speicherbereinigung in arcpy fehlerhaft ist und tatsächlich viel schneller ist, wenn Sie sie ausschalten. Ich weiß, dass die Zeile, die auf nichts in der Zeile gesetzt ist, auf diese Weise besser funktioniert. Einige würden sagen, dass es überflüssig ist, irgendetwas auf nichts zu setzen, aber das ist es nicht. Versuchen Sie, Ihre Garbage Collection zu Beginn Ihres Skripts auszuschalten, und messen Sie die Zeitunterschiede. Ich benutze auch del row, nicht row = none, aber das ist eine andere Diskussion: versuchen Sie, gc gc.disable () zu importieren
Hairy
@Hairy, es war mir nicht in den Sinn gekommen, den GC zu deaktivieren. Ich werde es versuchen.
Tharen
Dies funktioniert bei mir nicht, da ich die Feature-Class benötige. Außerdem bekomme ich später einen UpdateCursor für eine andere Feature-Class und dieser wird ebenfalls gesperrt. Am Ende benutzte ich Spiegel und Fingerspitzengefühl, um dorthin zu gelangen, wo ich sein musste. Ich bin mir nicht sicher, wie lange es halten wird. Vielen Dank.
Justin
1

Müssen Sie Ihr ArcPy-Skript in ArcMap ausführen? Sofern es nicht Teil einer von Ihnen erstellten Schnittstelle oder Toolbox ist, können Sie es außerhalb von ArcMap über eine Python-Konsole, IDLE oder Eclipse usw. ausführen (sofern Sie über eine entsprechende Lizenz auf dem Computer verfügen, auf dem es ausgeführt wird). In diesem Fall können Sie einen kleinen Python-Code schreiben, um Ihr ArcPy-Skript als Unterprozess zu erzeugen. Die Sperre sollte aufgehoben werden, wenn der Unterprozess geschlossen wird.

ArcGIS-Sperren sind ein Schmerz. Ich hatte Situationen, in denen ein Schloss auch nach dem Herunterfahren der Maschine bestehen bleibt, was ein enormer Schmerz ist (normalerweise, wenn Arc abgestürzt ist, bevor es die Schlösser aufräumen kann). Verwenden Sie in diesem Fall als letzten Ausweg den Windows Explorer, um die .LOCK-Datei zu suchen und manuell zu löschen. Dies funktioniert nicht, wenn auf ArcMap oder einen Python-Prozess zugegriffen wird, daher ist es relativ sicher ... aber dies ist wirklich eine Get-Out-of-Jail-Karte und keine gute Praxis :)

MappaGnosis
quelle
1

Wenn Sie sowohl die Zeilen- als auch die Cursorobjekte (z. B. del row, rows) ordnungsgemäß löschen und die Sperre erhalten bleibt, ist es wahrscheinlich, dass ArcMap selbst, nicht arcpy, immer noch darauf verweist.

Wird das Shapefile von einer Ebene im Inhaltsverzeichnis referenziert oder wird es von Ihrem Skript-Tool zum Inhaltsverzeichnis hinzugefügt?

In letzterem Fall können Sie versuchen, "Ergebnisse von Geoverarbeitungsvorgängen zur Anzeige hinzufügen" unter Geoverarbeitung-> Geoverarbeitungsoptionen in ArcMap zu deaktivieren.

Ein zusätzlicher Vorschlag: Wenn Sie dies als temporäres / intermediäres Dataset tun und die Anzahl der Features nicht zu groß ist, versuchen Sie, den in_memoryArbeitsbereich anstelle eines Shapefiles zu verwenden, um das Sperrproblem vollständig zu umgehen und eine gute potenzielle Leistungssteigerung zu erzielen .

Stellen Sie einfach sicher, dass Sie den Arbeitsbereich in_memory oder die spezifischen Datensätze, die Sie dort mit Löschen (Datenverwaltung) erstellen, löschen, bevor Sie das Skript beenden. Andernfalls bleibt es im Speicher, bis die Anwendung geschlossen wird.

Abschließend möchte ich noch darauf hinweisen, dass sich das Sperrverhalten von Shapefiles in 10.0 geändert hat, um strenger zu werden, indem die Sperrdateien nicht entfernt werden, wenn Sie eine Ebene aus dem Inhaltsverzeichnis entfernen. Siehe auch diesen Artikel und diese verwandte Frage .

blah238
quelle
Es ist definitiv ArcMap. Ich denke, das Aufrufen eines Cursors hebt die vorherige Cursorsperre auf. Ich rufe einen SearchCursor auf einem fc auf. Dann einen UpdateCursor auf einem anderen fc und die vorherige Sperre verschwindet. Ich kann einen dritten Dummy-Cursor für eine Datei aufrufen, die nicht gelöscht werden muss, nur um den Black-Box-Stil zu umgehen. Vielen Dank.
Justin