Минулого тижня я розмістив запитання про налаштування класу ToolValidator і отримав кілька дуже хороших відповідей. Працюючи з запропонованими рішеннями, я створив спеціальний модуль, який виконує запити на db, і буде викликаний класом ToolValidator (для надання значень для випадаючих списків), а також пізніше в сценарії геообробки (щоб отримати інші параметри на основі елементів, вибраних у спадному списку). Однак я не можу насправді викликати спеціальний модуль у класі ToolValidator. Я намагався без успіху приєднатись до шляху. Коли я намагаюся застосувати ці зміни до сценарію, я отримую помилку виконання: [Errno 9] Неправильний дескриптор файлу. Якщо я прокоментую рядок імпорту, помилок не буде.
sys.path.append('my_custom_module_directory')
import my_custom_module
Багато з вас можуть запитати, чому я просто не реалізую спеціальний інструмент з ArcObjects. Причина полягає в тому, що мої кінцеві користувачі не мають привілеїв, необхідних для того, щоб зареєструвати будь-які клітини на своєму комп'ютері.
ОНОВЛЕННЯ: Це сталося зі мною в ArcGIS 10. Цікаво, що я спочатку додавав до шляху всередині функції inicijaliazeParameters класу ToolValidator. Якщо я додаю за межами (тобто поверх) класу ToolValidator, все працює як очікувалося.
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()
ОНОВЛЕННЯ 2: Я думаю, що я знайшов справжню причину своєї проблеми. У фрагментах коду в цій публікації я додаю до sys.path справжні шляхи (наприклад, C: / Working / SomeFolder). У моєму фактичному класі ToolValidator я будував відносний шлях, використовуючи os.path.dirname(__file__)
+ "\ my_special_folder ...". Я очікував, що os.path.dirname(__file__)
поверне шлях до панелі інструментів, оскільки він містить клас ToolValidator. Я виявив, що це не так. Наскільки я можу сказати, клас ToolValidator ніколи насправді не записується у файл .py, і я припускаю, що цей код передається інтерпретатору python у пам'яті, тому __file__
він марний, або якийсь темп-сценарій зберігається, а потім виконується execfile ( path_to_script) викликається, знову рендеринг__file__
марний. Я впевнений, що є й інші причини, яких я пропускаю.
Коротше кажучи, якщо я використовую жорстко закодований шлях, sys.append працює де завгодно, відносні шляхи не так добре працюють у класі ToolValidator.