ArcGIS Python SearchCursor mengunci file?

11

Saya memiliki skrip yang mendapat nilai dari bidang shapefile untuk kembali ke pengguna.

Tampaknya hanya ketika arcpy.SearchCursor disebut ArcMap 10.0 mengunci file dan tidak bisa dihapus setelah skrip selesai berjalan. Untuk membuka kunci, saya harus menutup ArcMap. Dalam skrip saya menghapus objek SearchCursor setelah menggunakannya serta objek baris.

Cara saya membuat skrip bekerja adalah ia mencoba menghapus folder workspace pada menjalankan selanjutnya tetapi tidak bisa karena kunci ... sampai tentu saja saya menutup ArcMap.

Apakah ada saran untuk melepaskan kunci ini?

Justin
sumber

Jawaban:

4

masalah terpecahkan setelah pergi dari:

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

untuk

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

Lihat Tidak dapat menyingkirkan kunci pada file geodatabase dan kelas fitur yang dibuat dalam skrip Python . Sepertinya masalah yang sama. Saya telah mengatasinya sebelumnya dengan menghapus kelas fitur secara eksplisit. Saya tidak yakin apakah ini akan berhasil dalam semua kasus.

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)

Memaksa pengumpulan sampah dapat bekerja juga, tetapi dugaan saya adalah bahwa ini ada hubungannya dengan kerja internal arcpy atau ArcMap.

import gc
gc.collect()
Tharen
sumber
Saya mengedit ini, karena referensi baris harus dihapus setelah setiap iterasi kursor, jika tidak panggilan di luar loop berlebihan. Ini juga yang saya pilih sebagai satu-satunya cara saya bisa mengatasi masalah yang sama ketika saya memilikinya.
Berbulu
@ Dairy OK, tapi saya pikir ini poin bisu. Python mengurangi referensi ke objek baris sebelumnya pada setiap iterasi ketika objek baris baru ditugaskan ke variabel baris . row = Nonesetelah loop cukup membersihkan tugas baris terakhir. Memindahkannya ke dalam loop adalah duplikasi usaha. Dalam hal apa pun, pengumpul sampah harus membatalkan alokasi memori kecuali arcpy atau ArcMap secara internal mempertahankan referensi ke objek baris.
tharen
tidak apa-apa untuk setuju untuk tidak setuju, atau menjadi titik diperdebatkan. Saya tahu bahwa pengumpulan sampah di arcpy cacat, dan sebenarnya jauh lebih cepat jika Anda mematikannya. Adapun baris tidak diatur dalam baris, saya tahu itu bekerja lebih baik seperti itu. Beberapa orang akan mengatakan pengaturan apa pun kepada tidak ada yang berlebihan, tetapi tidak. Silakan mematikan pengumpulan sampah Anda di awal skrip Anda dan mengukur perbedaan waktu. Saya juga menggunakan baris del, bukan baris = tidak ada, tapi itu diskusi lain: coba impor gc gc.disable ()
Hairy
@Hairy, Tidak terpikir olehku untuk menonaktifkan gc. Saya akan mencobanya.
tharen
Ini tidak berfungsi untuk saya karena saya memerlukan kelas fitur. Juga saya kemudian mendapatkan UpdateCursor di kelas fitur lain dan ini bisa dikunci juga. Saya akhirnya menggunakan cermin dan sulap untuk mendapatkan tempat yang saya butuhkan. Tidak yakin berapa lama akan bertahan. Terima kasih.
Justin
1

Apakah Anda perlu menjalankan skrip ArcPy Anda dari dalam ArcMap? Kecuali jika itu bagian dari antarmuka atau kotak peralatan yang Anda buat, Anda bisa menjalankannya di luar ArcMap dari konsol Python, IDLE, atau Eclipse dll (selama Anda memiliki lisensi yang sesuai pada mesin yang sedang berjalan). Jika demikian, Anda dapat menulis kode Python kecil untuk menelurkan skrip ArcPy Anda sebagai subproses dan kunci harus dilepaskan ketika subproses ditutup.

Kunci ArcGIS menyebalkan. Saya memiliki situasi di mana kunci tetap ada bahkan setelah mematikan mesin, yang merupakan rasa sakit yang monumental (biasanya jika Arc telah crash sebelum dapat merapikan kunci). Sebagai upaya terakhir, jika ini terjadi, gunakan Windows Explorer untuk menemukan file .LOCK dan menghapusnya secara manual. Ini tidak akan berfungsi jika sedang diakses oleh ArcMap atau proses Python, sehingga relatif aman ... tapi ini benar-benar kartu Get-Out-of-Jail dan bukan latihan yang baik :)

MappaGnosis
sumber
1

Jika Anda menghapus objek baris dan kursor dengan benar (mis. del row, rows) Dan kunci tetap ada, kemungkinan karena ArcMap sendiri, bukan arcpy, masih merujuknya.

Apakah shapefile direferensikan oleh lapisan dalam daftar isi, atau ditambahkan ke TOC oleh alat skrip Anda?

Jika yang terakhir, Anda dapat mencoba menonaktifkan "Tambahkan hasil operasi geoprocessing ke layar" di bawah Geoprocessing-> Opsi Geoprocessing di ArcMap.

Saran tambahan: Jika Anda melakukan ini sebagai dataset sementara / menengah, dan jumlah fitur tidak terlalu besar, coba gunakan in_memoryruang kerja alih-alih shapefile untuk menyelesaikan masalah penguncian sepenuhnya dan dapatkan potensi peningkatan kinerja yang bagus juga .

Pastikan untuk menghapus ruang kerja in_memory atau set data tertentu yang Anda buat di sana menggunakan Delete (Data Management) sebelum keluar dari skrip, jika tidak maka akan terus berada di memori hingga aplikasi ditutup.

Terakhir saya juga akan mencatat bahwa perilaku penguncian shapefile berubah pada 10.0 menjadi lebih ketat dengan tidak menghapus file kunci ketika Anda menghapus lapisan dari daftar isi. Lihat juga artikel ini dan pertanyaan terkait ini .

blah238
sumber
Sudah pasti ArcMap. Saya pikir memanggil kursor membunuh kunci kursor sebelumnya. Saya memanggil SearchCursor di fc..kemudian UpdateCursor di fc lain dan kunci sebelumnya hilang. Saya dapat memanggil kursor dummy ketiga pada file yang tidak perlu dihapus hanya untuk menangani kunci membunuh gaya kotak hitam. Terima kasih.
Justin