Tôi đã đăng một câu hỏi tuần trước về việc tùy chỉnh một lớp ToolValidator và nhận được một số câu trả lời rất tốt. Khi làm việc với các giải pháp được đề xuất, tôi đã tạo ra một mô-đun tùy chỉnh thực hiện các truy vấn trên db và sẽ được cả lớp ToolValidator gọi (để cung cấp các giá trị cho danh sách thả xuống) và sau đó trong tập lệnh xử lý địa lý (để lấy khác tham số dựa trên các mục được chọn trong danh sách thả xuống). Tuy nhiên, tôi dường như không thể thực sự gọi mô-đun tùy chỉnh trong lớp ToolValidator. Tôi đã cố gắng nối vào con đường không có may mắn. Khi tôi cố gắng áp dụng những thay đổi này cho tập lệnh, tôi gặp lỗi thời gian chạy: [Errno 9] Mô tả tệp xấu. Nếu tôi nhận xét ra dòng nhập khẩu, không có lỗi.
sys.path.append('my_custom_module_directory')
import my_custom_module
Nhiều bạn có thể hỏi tại sao tôi không triển khai một công cụ tùy chỉnh với ArcObjects. Lý do là người dùng cuối của tôi không có các cáo buộc cần thiết để đăng ký BẤT K d dlls nào trên máy tính của họ.
CẬP NHẬT: Điều này đã xảy ra với tôi trong ArcGIS 10. Điều thú vị là, ban đầu tôi đã nối thêm vào đường dẫn bên trong hàm initiazeParameter của lớp ToolValidator. Nếu tôi thực hiện nối thêm bên ngoài (tức là trên đầu trang) của lớp ToolValidator, mọi thứ sẽ hoạt động như mong đợi.
sys.path.append('C:/Working/SomeFolder')
import somescript -------->THIS WORKS
class ToolValidator:
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
def __init__(self):
"""Setup arcpy and the list of tool parameters."""
import arcpy
sys.path.append('C:/Working/SomeFolder')
import somescript -------> THIS DOESNT WORK
self.params = arcpy.GetParameterInfo()
CẬP NHẬT 2: Tôi nghĩ rằng tôi đã tìm thấy nguyên nhân thực sự của vấn đề của tôi. Trong đoạn mã trong bài đăng này, tôi đã thêm các đường dẫn có vẻ là đường dẫn thực (ví dụ: C: / Work / someFolder) vào sys.path. Trong lớp ToolValidator thực tế của tôi, tôi đã xây dựng một đường dẫn tương đối bằng cách sử dụng os.path.dirname(__file__)
+ "\ my_special_folder ...". Tôi đã dự đoán rằng os.path.dirname(__file__)
sẽ trả về đường dẫn của hộp công cụ, vì nó chứa lớp ToolValidator. Tôi đã đến để tìm thấy đây không phải là trường hợp. Theo như tôi có thể nói, lớp ToolValidator thực sự không bao giờ được ghi vào tệp .py và tôi suy đoán mã này được truyền cho trình thông dịch python trong bộ nhớ, vì vậy __file__
vô dụng hoặc một số tập lệnh tạm thời được duy trì và sau đó thực thi ( path_to_script) được gọi, kết xuất lại__file__
vô ích. Tôi chắc chắn có những lý do khác tôi cũng bị mất.
Tóm lại, nếu tôi sử dụng một đường dẫn được mã hóa cứng, sys.append hoạt động ở bất cứ đâu, các đường dẫn tương đối không hoạt động tốt trong lớp ToolValidator.