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?
quelle
row = None
Nach 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.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 :)
quelle
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_memory
Arbeitsbereich 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 .
quelle