Làm mới các mô-đun đã nhập trong ArcGIS Python Toolbox?


15

Khi sử dụng hộp công cụ python (.pyt) trong ArcMap, thông thường tôi sẽ theo một mẫu trong đó tệp .pyt chỉ đơn giản là một trình bao bọc để thu thập các đối số đầu vào và tự xác định các công cụ. Mã hỗ trợ được giữ trong các mô-đun thử nghiệm đơn vị riêng biệt.

Thí dụ:

import supporting_module

class MyTool(object):

    ...

    def execute(self, parameters, messages):
        """The source code of the tool."""
        some_input = parameters[0].valueAsText
        some_output = parameters[1].valueAsText

        supporting_module.do_something(some_input, some_output)
        arcpy.SetParameter(2, some_output)

Điều này thực sự tốt nhưng tôi gặp phải một vấn đề khó chịu trong quá trình phát triển. Nhấp chuột phải -> Làm mới trên .pyt trong ArcMap chỉ làm mới mã của tệp .pyt. Nó không làm mới các mô-đun đã nhập, vì vậy tôi phải đóng và mở lại ArcMap bất cứ khi nào tôi thay đổi một cái gì đó ở đó. May mắn thay, vì tôi đang kiểm tra mã độc lập, tôi không phải làm điều này một tấn, nhưng nó vẫn là một rắc rối lớn. Có cách nào để khắc phục điều này? Một số thứ liên quan - có cách nào để làm mới hoàn toàn bảng điều khiển Python (tôi có gói trang web tùy chỉnh mà tôi cũng phải đóng / mở lại ArcMap để kéo theo các thay đổi từ đó không)?

Tôi đang sử dụng ArcMap 10.2.1.

Câu trả lời:


14

Tôi đã tìm thấy khả năng này, /programming/1517038/python-refresh-reload

Một lưu ý là nếu bạn có bất kỳ biến nào được gán cho mô-đun, chúng sẽ cần được gán lại.

Nhưng như bạn đã viết ở trên, bạn có thể làm điều này:

import supporting_module
def execute()
  reload(supporting_module)
  ...

Bằng cách này mỗi khi bạn chạy công cụ, bạn chắc chắn sẽ có mô-đun được cập nhật. Một khi phát triển được thực hiện, điều này có thể được đưa ra.


1
Vô cùng hữu ích và điều này không giải quyết được ví dụ đơn giản mà tôi đã đăng. Tuy nhiên, nếu hỗ trợ_module cũng nhập các mô đun trợ giúp khác, thì chúng cũng cần phải được gọi với tải lại. Tôi nghĩ rằng đây là điều tốt nhất chúng ta sẽ có được vì nó hợp lý với cách Python tải các mô-đun - Tôi sẽ đánh dấu câu trả lời của bạn nếu một thứ gì đó mạnh mẽ hơn không xuất hiện vào ngày hôm sau.
Josh Werts

Rất hữu ích. Tôi đã thấy rằng việc gọi reload()ngay sau khi nhập mô-đun hỗ trợ là đủ , ở đầu tệp PYT của hộp công cụ. Do đó, nếu hộp công cụ chứa một số công cụ, tôi không phải sao chép tải lại trong mỗi execute()chức năng của công cụ .
Mike Finch

Tôi thực sự không hiểu làm thế nào anwser này giải quyết vấn đề. Tôi có Công cụ của mình được lưu trữ trong các tệp .py và tôi nhập chúng bằng cách sử dụng from pyfile import Tool, thêm reload(tool)trả về typeError: reload() argument must be module. Có ý kiến ​​gì không?
Ratnanil

2
Tôi tìm thấy giải pháp! trước tiên, nhập tệp py dưới dạng Mô-đun, tải lại và sau đó nhập lớp trong mô-đun. Xem: stackoverflow.com/a/6946467/4139249
Ratnanil

5

Đây là một cách khác nhau và mạnh mẽ hơn tôi đã đề xuất trước đây.

Tôi đã không sử dụng mô-đun này cho mình, nhưng tôi nghĩ rằng nó sẽ giải quyết vấn đề của bạn:

Trình tải lại mô-đun Python

Thư viện này thực hiện một trình tải lại mô-đun dựa trên phụ thuộc cho Python. Không giống như hàm reload (), trình tải lại này sẽ tải lại mô-đun được yêu cầu và tất cả các mô-đun khác phụ thuộc vào mô-đun đó.

Cho ví dụ trước, điều này sẽ tải tất cả các phụ thuộc với một cuộc gọi:

import reloader
reloader.enable()

import supporting_module

def execute()
  reloader.reload(supporting_module)
  ...

Đây là lần đầu tiên tôi nhận thấy mô-đun này, vì vậy nếu bạn triển khai nó trong các công cụ của mình, hãy nhận xét lại về việc nó hoạt động tốt như thế nào đối với bạn.


Tìm tốt Điều này làm việc nếu được thêm chính xác như bạn hiển thị. Tôi chỉ phải nhấp chuột phải -> làm mới trên hộp công cụ nếu tệp .pyt tự thay đổi. Các mô-đun hỗ trợ và các mô-đun phụ của chúng đang được tải lại thành công. Mặc dù vậy, có một cảnh báo - tôi đã có một vài trường hợp ngoại lệ không thể giải thích được và sự cố ArcMap (mặc dù sự cố ArcMap thực sự không có gì bất thường, thật không may). Lưu ý - Tôi chỉ thử nghiệm điều này với mô đun hỗ trợ và một mô đun con phụ thuộc. Có thể báo cáo lại về sự ổn định trong tương lai.
Josh Werts

1
Siêu, cảm ơn vì đã báo cáo lại. Vâng, khi lái ArcMap, đôi khi tôi cảm thấy như một Dummy Test Dummy.
cndnflyr

Thật không may, tôi đã gặp phải quá nhiều vấn đề về độ ổn định với trình tải lại này, vì vậy tôi đã thay đổi câu trả lời được chọn thành hàm tích hợp tải lại ban đầu (). Đôi khi đơn giản hơn là tốt hơn!
Josh Werts
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.