ArcGIS Python SearchCoder khóa?


11

Tôi có một tập lệnh nhận giá trị từ trường của shapefile để trả về cho người dùng.

Có vẻ như chỉ khi arcpy.SearchCoder được gọi là ArcMap 10.0 mới khóa tệp và nó không bị xóa sau khi tập lệnh chạy xong. Để tắt khóa, tôi phải đóng ArcMap. Trong đoạn script tôi xóa đối tượng SearchCthon sau khi sử dụng nó cũng như đối tượng hàng.

Cách tôi có tập lệnh hoạt động là nó cố xóa thư mục không gian làm việc trong các lần chạy tiếp theo nhưng không thể vì khóa ... cho đến khi tất nhiên tôi đóng ArcMap.

Có lời khuyên nào về việc khóa này để biến mất?

Câu trả lời:


4

vấn đề đã được giải quyết sau khi đi từ:

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

đến

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

3

Xem Không thể thoát khỏi khóa trên cơ sở dữ liệu địa lý tệp và lớp tính năng được tạo trong tập lệnh Python . Có vẻ như cùng một vấn đề. Tôi đã nhận được xung quanh nó trước khi xóa rõ ràng lớp tính năng. Tôi không chắc chắn nếu điều này sẽ làm việc trong mọi trường hợp.

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)

Buộc một bộ sưu tập rác cũng có thể hoạt động, nhưng linh cảm của tôi là điều này có liên quan đến hoạt động bên trong của Arcpy hoặc ArcMap.

import gc
gc.collect()

Tôi đã chỉnh sửa điều này, vì tham chiếu hàng nên được loại bỏ sau mỗi lần lặp của con trỏ, nếu không thì cuộc gọi bên ngoài vòng lặp là không cần thiết. Đây cũng là một thứ tôi đã bình chọn vì đây là cách duy nhất tôi có thể giải quyết vấn đề tương tự khi tôi có nó.
Lông

@Hurine OK, nhưng tôi nghĩ đó là một điểm câm. Python giảm các tham chiếu đến đối tượng hàng trước trên mỗi lần lặp khi một đối tượng hàng mới được gán cho biến hàng . row = Nonesau vòng lặp chỉ cần dọn sạch các bài tập hàng cuối cùng. Di chuyển nó trong vòng lặp là sự trùng lặp của nỗ lực. Trong mọi trường hợp, trình thu gom rác nên phân bổ bộ nhớ trừ khi Arcpy hoặc ArcMap bên trong duy trì một tham chiếu đến các đối tượng hàng.
tharen

Bạn đồng ý không đồng ý, hoặc đó là một điểm cần thiết. Tôi biết rằng bộ sưu tập rác trong arcpy là thiếu sót, và thực sự nhanh hơn rất nhiều nếu bạn tắt nó đi. Đối với hàng được đặt thành không có gì trong hàng, tôi biết nó hoạt động tốt hơn theo cách đó. Một số người sẽ nói thiết lập bất cứ điều gì là không cần thiết, nhưng thực tế không phải vậy. Hãy thử tắt bộ sưu tập rác của bạn khi bắt đầu tập lệnh của bạn và đo lường sự khác biệt về thời gian. Tôi cũng sử dụng del row, không row = none, nhưng đó là một vấn đề khác: hãy thử nhập gc gc.disable ()
Hairy

@Hơ, tôi đã vô hiệu hóa gc. Tôi sẽ thử.
tharen

Điều này không làm việc cho tôi vì tôi cần lớp tính năng. Ngoài ra, sau đó tôi nhận được một UpdateCthon trên một lớp tính năng khác và điều này cũng bị khóa. Tôi đã kết thúc bằng cách sử dụng gương và ánh sáng của bàn tay để đến nơi tôi cần. Không chắc nó sẽ giữ được bao lâu. Cảm ơn.
Justin

1

Bạn có cần chạy tập lệnh ArcPy của mình từ bên trong ArcMap không? Trừ khi nó là một phần của giao diện hoặc hộp công cụ bạn đã tạo, bạn có thể chạy nó bên ngoài ArcMap từ bảng điều khiển Python, IDLE hoặc Eclipse, v.v (miễn là bạn có giấy phép phù hợp trên máy đang chạy). Nếu đây là trường hợp bạn có thể viết một mã Python nhỏ để sinh ra tập lệnh ArcPy của bạn dưới dạng một quy trình con và khóa sẽ được giải phóng khi đóng quy trình con.

Khóa ArcGIS là một nỗi đau. Tôi đã có những tình huống khóa vẫn tồn tại ngay cả sau khi tắt máy, đó là một nỗi đau lớn (thường là nếu Arc bị hỏng trước khi nó có thể dọn dẹp ổ khóa). Như một phương sách cuối cùng, nếu điều này xảy ra, hãy sử dụng Windows Explorer để tìm tệp .LOCK và xóa thủ công. Điều này sẽ không hoạt động nếu nó được truy cập bởi ArcMap hoặc một quy trình Python, vì vậy nó tương đối an toàn ... nhưng đây thực sự là một thẻ Thoát ra và không thực hành tốt :)


1

Nếu bạn đang xóa đúng cả hai đối tượng hàng và con trỏ (ví dụ del row, rows) và khóa vẫn còn, thì có khả năng là do bản thân ArcMap, không phải Arcpy, vẫn tham chiếu đến nó.

Là shapefile được tham chiếu bởi một lớp trong mục lục hay nó được thêm vào TOC bởi công cụ tập lệnh của bạn?

Nếu sau này, bạn có thể thử tắt "Thêm kết quả của hoạt động xử lý địa lý vào màn hình" trong Công cụ địa lý-> Tùy chọn xử lý địa lý trong ArcMap.

Một đề xuất bổ sung: Nếu bạn đang thực hiện việc này dưới dạng tập dữ liệu tạm thời / trung gian và số lượng tính năng không quá lớn, hãy thử sử dụng in_memorykhông gian làm việc thay vì shapefile để khắc phục hoàn toàn vấn đề khóa và tăng hiệu suất tiềm năng tốt .

Chỉ cần chắc chắn xóa không gian làm việc in_memory hoặc bộ dữ liệu cụ thể bạn tạo ở đó bằng cách sử dụng Xóa (Quản lý dữ liệu) trước khi thoát tập lệnh, nếu không nó sẽ tiếp tục nằm trong bộ nhớ cho đến khi ứng dụng đóng lại.

Cuối cùng tôi cũng sẽ lưu ý rằng hành vi khóa shapefile đã thay đổi trong 10.0 để trở nên nghiêm ngặt hơn bằng cách không xóa các tệp khóa khi bạn xóa một lớp khỏi mục lục. Xem thêm bài viết nàycâu hỏi liên quan này .


Nó chắc chắn là ArcMap. Tôi nghĩ rằng việc gọi một con trỏ sẽ giết khóa con trỏ trước đó. Tôi gọi một SearchCoder trên một fc..vậy một UpdateCoder trên một fc khác và khóa trước đó biến mất. Tôi có thể gọi một con trỏ giả thrid trên một tệp không cần phải xóa chỉ để xử lý kiểu khóa hộp đen. Cảm ơn.
Justin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.