ArcGIS Python SearchCursor blokowanie plików?

11

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?

Justin
źródło

Odpowiedzi:

4

problem został rozwiązany po przejściu z:

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

do

rows = arcpy.UpdateCursor(fc)
for row in rows:
    rows.deleteRow(row)
del row
del rows
b. Bacia
źródło
3

Zobacz Nie można pozbyć się blokady na geobazie pliku i klasie obiektów utworzonych w skrypcie Python . Wygląda na ten sam problem. Ominąłem się już wcześniej, wyraźnie usuwając klasę obiektów. Nie jestem pewien, czy to zadziała we wszystkich przypadkach.

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)

Wymuszanie wyrzucania elementów bezużytecznych może również działać, ale mam przeczucie, że ma to coś wspólnego z wewnętrznym działaniem arcpy lub ArcMap.

import gc
gc.collect()
Tharen
źródło
Zredagowałem to, ponieważ odwołanie do wiersza powinno być usuwane po każdej iteracji kursora, w przeciwnym razie wywołanie poza pętlą jest zbędne. Głosowałem również za tym, ponieważ to jedyny sposób, w jaki mogłem poradzić sobie z tym samym problemem, kiedy go miałem.
Hairy
@ Mleczarstwo OK, ale myślę, że to niemy. Python zmniejsza odniesienia do poprzedniego obiektu wiersza podczas każdej iteracji, gdy nowy obiekt wiersza jest przypisany do zmiennej wiersza . row = Nonepo 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.
tharen
zgadza się nie zgadzać, lub jest to kwestia sporna. Wiem, że zbieranie śmieci w arcpy jest wadliwe i jest o wiele szybsze, jeśli je wyłączysz. Co do wiersza ustawionego na nic w wierszu, wiem, że działa lepiej. Niektórzy twierdzą, że ustawienie czegokolwiek na nic nie jest zbędne, ale tak nie jest. Spróbuj wyłączyć zbieranie śmieci na początku skryptu i zmierz różnice czasowe. Używam też del row, nie row = none, ale to kolejna dyskusja: spróbuj zaimportować gc gc.disable ()
Hairy
@ Mleczko, nie przyszło mi do głowy, aby wyłączyć gc. Dam temu szansę.
tharen
To nie działa dla mnie, ponieważ potrzebuję klasy funkcji. Później otrzymuję UpdateCursor w innej klasie funkcji i to również zostaje zablokowane. Skończyło się na użyciu luster i sztuczek, aby dostać się tam, gdzie muszę być. Nie jestem pewien, jak długo to wytrzyma. Dzięki.
Justin
1

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ą :)

MappaGnosis
źródło
1

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_memoryobszaru 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 .

blah238
źródło
To zdecydowanie ArcMap. Myślę, że wywołanie kursora zabija poprzednią blokadę kursorów. Nazywam SearchCursor na fc .. następnie UpdateCursor na innym fc i poprzednia blokada znika. Mogę wywołać trzeci manekin kursor na pliku, którego nie trzeba będzie usuwać tylko po to, aby obsłużyć styl blokujący czarne skrzynki. Dzięki.
Justin