Mam skrypt, który pobiera wartość z pola pliku kształtu, aby zwrócić użytkownikowi.
Wydaje się, że tylko wtedy, gdy arcpy.SearchCursor nazywa się ArcMap 10.0, blokuje plik i nie można go usunąć po zakończeniu działania skryptu. Aby wyłączyć blokadę, muszę zamknąć ArcMap. W skrypcie usuwam obiekt SearchCursor po jego użyciu, a także obiekt wiersza.
Skrypt działa tak, że próbuje usunąć folder obszaru roboczego przy kolejnych uruchomieniach, ale nie może z powodu blokady ... dopóki oczywiście nie zamknę ArcMap.
Czy jest jakaś rada na temat odejścia tego zamka?
źródło
row = None
po pętli po prostu czyści ostatnie przypisanie wiersza. Przenoszenie go w pętli jest powielaniem wysiłku. W każdym razie śmieciarz powinien cofnąć przydział pamięci, chyba że arcpy lub ArcMap wewnętrznie zachowuje odniesienie do obiektów wiersza.Czy potrzebujesz uruchomić skrypt ArcPy z poziomu ArcMap? O ile nie jest to część wbudowanego interfejsu lub zestawu narzędzi, możesz go uruchomić poza ArcMap z konsoli Python, IDLE, Eclipse itp. (O ile masz odpowiednią licencję na maszynę, na której jest uruchomiony). W takim przypadku możesz napisać mały kod Python, aby spawnować skrypt ArcPy jako podproces, a blokada powinna zostać zwolniona po zamknięciu podprocesu.
Zamki ArcGIS są uciążliwe. Miałem sytuacje, w których zamek utrzymuje się nawet po wyłączeniu maszyny, co jest ogromnym bólem (zwykle, gdy Arc rozbił się, zanim mógł uporządkować zamki). W ostateczności, jeśli tak się stanie, użyj Eksploratora Windows, aby znaleźć plik .LOCK i usunąć go ręcznie. To nie zadziała, jeśli jest uzyskiwany przez ArcMap lub proces Pythona, więc jest względnie bezpieczny ... ale to naprawdę karta Get-Out-of-Jail i nie jest dobrą praktyką :)
źródło
Jeśli prawidłowo usuwasz zarówno obiekty wiersza, jak i kursora (np.
del row, rows
), A blokada pozostaje, prawdopodobnie jest to spowodowane tym, że sama ArcMap, a nie arcpy, nadal się do niej odwołuje.Czy plik kształtu jest przywoływany przez warstwę w spisie treści, czy też jest dodawany do spisu treści za pomocą narzędzia skryptowego?
Jeśli to drugie, możesz spróbować wyłączyć opcję „Dodaj wyniki operacji geoprzetwarzania do wyświetlacza” w obszarze Geoprocessing- > Opcje geoprzetwarzania w ArcMap.
Dodatkowa sugestia: jeśli robisz to jako tymczasowy / pośredni zestaw danych, a liczba funkcji nie jest zbyt duża, spróbuj użyć
in_memory
obszaru roboczego zamiast pliku kształtu, aby całkowicie obejść problem z blokowaniem i uzyskać miły potencjalny wzrost wydajności .Pamiętaj tylko o usunięciu obszaru roboczego in_memory lub określonych zestawów danych, które tam utworzysz za pomocą Delete (zarządzanie danymi) przed wyjściem ze skryptu, w przeciwnym razie pozostanie on w pamięci aż do zamknięcia aplikacji.
Na koniec chciałbym również zauważyć, że zachowanie blokowania plików kształtu zmieniło się w 10.0, aby stało się bardziej surowe, nie usuwając plików blokujących po usunięciu warstwy ze spisu treści. Zobacz także ten artykuł i powiązane pytanie .
źródło