Hướng dẫn tổ chức Hộp công cụ Python (.pyt) trong ArcGIS


17

Đối với một trong những nhiệm vụ của mình, tôi cần tạo một Hộp công cụ với ba công cụ (tập lệnh python).

Thay vì tbx thông thường, tôi đã quyết định viết nó dưới dạng Python Toolbox (pyt).

Mọi thứ đều rõ ràng ngoại trừ cách "tốt" để tổ chức mã.

Vì tôi có ba công cụ nên cách lưu trữ chúng trong một tệp không phải là cách tốt. Vì vậy, tôi đã quyết định giữ mỗi công cụ trong một tệp .py riêng biệt.

Đây là một vấn đề: cách tốt để tổ chức một số tệp với PYT để phân phối hoặc triển khai trên ArcGIS cho Máy chủ là gì? Tôi có nên giữ chúng ở cùng cấp độ với tệp PYT hay tôi nên đặt chúng trong một số thư mục con (tức là "Công cụ")?

Bạn có thể giới thiệu bất kỳ hướng dẫn nào của Esri hoặc tham khảo mẫu "hộp công cụ PYT lớn" không?

Tôi không tìm thấy bất cứ điều gì về chủ đề này. Trong phiên bản 10.0, cái gọi là cấu trúc thư mục ToolShare mà tôi đã sử dụng.

Đây là một câu hỏi về phong cách mã hóa. Bởi vì ý tưởng tạo một tệp PYT với 500-1000 dòng mã trở lên không phù hợp với tôi và tôi tin rằng đó không phải là cách "pythonic".


1
"Ý tưởng tạo một tệp PYT với 500-1000 dòng mã trở lên không phù hợp với tôi". Anh không cô đơn, Alex. Hôm nay tôi đã kịp thời tuyên bố rằng .pyt là một phát minh của tâm bệnh. Và tôi sẽ không hối tiếc.
Remigijus Pankevičius

Câu trả lời:


17

Hãy xem chủ đề này trên diễn đàn ArcGIS. Về cơ bản chỉ cần sử dụng các mô-đun python tiêu chuẩn hoặc cấu trúc gói và nhập các công cụ của bạn vào hộp công cụ python.

Cái gì đó như:

#  \--SomeDir
#     |  toolbox.pyt
#     \--toolpackage
#        |  __init__.py
#        |  script_a.py
#        |  script_b.py


#----------------------------
#The .pyt file
#----------------------------

import arcpy
import toolpackage.script_a.Tool1 as Tool1
import toolpackage.script_a.Tool2 as Tool2
import toolpackage.script_b.Tool3 as Tool3

class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "MultiTool Toolbox"
        self.alias = "mtt"

        # List of tool classes associated with this toolbox
        self.tools = [Tool1, Tool2, Tool3]

Tôi đã thấy rằng điều này hoạt động tốt trong ArcGIS Desktop, nhưng khi xuất bản dịch vụ xử lý địa lý sang phiên bản ArcGIS Server thì nó sẽ mất tất cả các tập lệnh và gói, ngoài tệp .pyt. Có thể thả các tập lệnh vào triển khai theo cách thủ công, nhưng điều đó làm tăng độ phức tạp.
Gnat

3
@Gnat Vâng, suy nghĩ của Luke cũng là kinh nghiệm của tôi. Các dịch vụ xuất bản của ESRI không nhận ra bất kỳ from x import ykiểu nhập nào. (Nhân tiện, điều đó hoàn toàn vô lý.) Tuy nhiên, tôi tin rằng bạn có thể để lại self.toolsđịnh nghĩa của mình và sử dụng import toolpackage.script_a.Tool1 as Tool1.
jpmc26

1
Bí danh phải ngắn gọn và chỉ chứa các chữ cái, tức là self.alias = "mtt"
Curtis Giá

2
Vì tôi chỉ mất một giờ để thực hiện các thay đổi đối với mã công cụ của mình và cố gắng dường như nó được phản ánh trong gui công cụ trong Arcmap, tôi muốn chia sẻ điều này. Nếu bạn thực hiện thay đổi mã của mình bên ngoài tệp pyt và muốn thấy nó được phản ánh trong gui công cụ, bạn phải khởi động lại ArcMap / Catalogue. Bạn có thể nhấn refresh trên hộp công cụ tất cả những gì bạn muốn, dường như chỉ tải lại chính pyt. Nó sẽ không tìm thấy những thay đổi cho mã khác.
TurboGus

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.