지난주 ToolValidator 클래스 사용자 정의에 대한 질문 을 게시했으며 매우 좋은 답변을 얻었습니다. 제안 된 솔루션을 사용하여 db에서 쿼리를 수행하는 사용자 정의 모듈을 만들었으며 ToolValidator 클래스 (드롭 다운 목록의 값을 제공하기 위해)와 나중에 지오 프로세싱 스크립트에서 호출됩니다 (기타 드롭 다운 목록에서 선택한 항목을 기반으로하는 매개 변수). 그러나 실제로 ToolValidator 클래스에서 사용자 지정 모듈을 호출 할 수 없습니다. 나는 운없이 길을 추가하려고 노력했다. 이러한 변경 사항을 스크립트에 적용하려고하면 런타임 오류가 발생합니다. [Errno 9] 잘못된 파일 설명자입니다. 가져 오기 줄을 주석 처리하면 오류가 없습니다.
sys.path.append('my_custom_module_directory')
import my_custom_module
많은 사람들이 왜 ArcObjects로 커스텀 툴을 구현하지 않는지 묻습니다. 그 이유는 최종 사용자가 자신의 컴퓨터에 dll을 등록하는 데 필요한 권한이 없기 때문입니다.
업데이트 : 이것은 ArcGIS 10에서 나에게 발생했습니다. 흥미롭게도, 처음에는 ToolValidator 클래스의 initialiazeParameters 함수 내부의 경로에 추가하고있었습니다. 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 파일에 작성되지 않으며이 코드가 메모리의 파이썬 인터프리터에 전달되므로 __file__
쓸모가 없거나 임시 스크립트가 지속되고 execfile ( path_to_script)가 호출되어 다시 렌더링됩니다.__file__
쓸모없는. 내가 놓친 다른 이유가 있다고 확신합니다.
간단히 말해, 하드 코딩 된 경로를 사용하면 sys.append는 어디에서나 작동하며 상대 경로는 ToolValidator 클래스에서 제대로 작동하지 않습니다.