Eu havia postado uma pergunta na semana passada sobre como personalizar uma classe ToolValidator e obtive algumas respostas muito boas. Ao trabalhar com as soluções propostas, criei um módulo personalizado que executa consultas em um banco de dados e será chamado pela classe ToolValidator (para fornecer valores para as listas suspensas) e posteriormente no script de geoprocessamento (para obter outras informações). parâmetros com base nos itens selecionados nas listas suspensas). No entanto, não consigo chamar o módulo personalizado na classe ToolValidator. Eu tenho tentado acrescentar ao caminho sem sorte. Quando tento aplicar essas alterações ao script, recebo um erro de tempo de execução: [Erro 9] Descritor de arquivo incorreto. Se eu comentar a linha de importação, não haverá erros.
sys.path.append('my_custom_module_directory')
import my_custom_module
Muitos de vocês podem estar se perguntando por que não apenas implemento uma ferramenta personalizada com o ArcObjects. O motivo é que meus usuários finais não têm os privilégios necessários para registrar QUALQUER dll no computador.
UPDATE: Isso estava acontecendo comigo no ArcGIS 10. Curiosamente, eu estava inicialmente acrescentando o caminho dentro da função initialiazeParameters da classe ToolValidator. Se eu fizer o acréscimo fora (ou seja, em cima) da classe ToolValidator, tudo funcionará conforme o esperado.
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()
ATUALIZAÇÃO 2: Acho que encontrei a verdadeira causa do meu problema. Nos trechos de código desta postagem, anexei o que parecem ser caminhos reais (ex: C: / Working / SomeFolder) ao sys.path. Na minha classe ToolValidator real, eu estava construindo um caminho relativo usando os.path.dirname(__file__)
+ "\ my_special_folder ...". Eu estava prevendo que os.path.dirname(__file__)
retornaria o caminho da caixa de ferramentas, uma vez que contém a classe ToolValidator. Eu vim para descobrir que este não é o caso. Pelo que sei, a classe ToolValidator nunca é realmente gravada em um arquivo .py, e especulo que esse código seja passado para o interpretador python na memória, por isso __file__
é inútil, ou algum script temporário é mantido e, em seguida, é executado o executável ( path_to_script) é chamado, renderizando novamente__file__
sem utilidade. Tenho certeza de que há outras razões pelas quais também estou ausente.
Para encurtar a história, se eu usar um caminho codificado, o sys.append funcionará em qualquer lugar, os caminhos relativos não funcionarão tão bem na classe ToolValidator.