ArcGIS Python Toolbox에서 가져온 모듈을 새로 고치겠습니까?


15

ArcMap에서 python toolbox (.pyt)를 사용할 때, 일반적으로 .pyt 파일 자체가 단순히 입력 인수를 수집하고 도구 자체를 정의하는 래퍼 인 패턴을 따릅니다. 지원 코드는 별도의 단위 테스트 가능 모듈로 유지됩니다.

예:

import supporting_module

class MyTool(object):

    ...

    def execute(self, parameters, messages):
        """The source code of the tool."""
        some_input = parameters[0].valueAsText
        some_output = parameters[1].valueAsText

        supporting_module.do_something(some_input, some_output)
        arcpy.SetParameter(2, some_output)

이것은 실제로 잘 작동하지만 개발 중에 하나의 좌절 문제가 발생했습니다. ArcMap에서 .pyt를 마우스 오른쪽 버튼으로 클릭-> 새로 고침은 .pyt 파일의 코드 만 새로 고칩니다. 가져온 모듈을 새로 고치지 않으므로 무언가를 변경할 때마다 ArcMap을 닫았다가 다시 열어야합니다. 다행히도, 코드를 독립적으로 테스트하기 때문에이 작업을 수행 할 필요는 없지만 여전히 큰 번거 로움입니다. 이 주위에 어떤 방법이 있습니까? 다소 관련이 있습니다-파이썬 콘솔을 완전히 새로 고칠 수있는 방법이 있습니까 (변경 사항을 가져 오기 위해 ArcMap을 닫거나 다시 열어야하는 사용자 정의 사이트 패키지가 있습니까)?

ArcMap 10.2.1을 사용하고 있습니다.

답변:


14

나는이 가능성을 발견했다 : https : //.com/questions/1517038/python-refresh-reload

한 가지주의 할 사항은 모듈에 변수가 할당 된 경우 다시 할당해야한다는 것입니다.

그러나 위에서 언급했듯이 다음과 같이 할 수 있습니다.

import supporting_module
def execute()
  reload(supporting_module)
  ...

이 방법으로 도구를 실행할 때마다 업데이트 된 모듈이 있어야합니다. 개발이 완료되면이를 제거 할 수 있습니다.


1
매우 유용하고 이것은 내가 게시 한 간단한 예제를 해결합니다. 그러나 support_module이 다른 도우미 모듈도 가져 오는 경우 다시로드와 함께 호출해야합니다. 나는 이것이 파이썬이 모듈을로드하는 방식에 의미가 있기 때문에 이것이 최선이라고 생각합니다. 다음 날에 더 강력한 것이 나오지 않으면 당신의 대답으로 표시 할 것입니다.
Josh Werts

매우 도움이됩니다. reload()도구 상자의 PYT 파일 상단에서 지원 모듈을 가져온 후 바로 호출하면 충분하다는 것을 알았습니다 . 따라서 도구 상자에 여러 도구가 포함되어 있으면 각 도구 execute()기능 에서 다시로드를 복제 할 필요가 없습니다 .
마이크 핀치

이 답변이 어떻게 문제를 해결하는지 이해하지 못합니다. 내가 가진 내 도구 평 파일에 저장 하고 나는 그들을 사용하여 가져 오기 from pyfile import Tool추가 reload(tool)수익을 typeError: reload() argument must be module. 어떤 아이디어?
Ratnanil

2
해결책을 찾았습니다! 먼저 py-File을 모듈로 가져 와서 다시로드 한 다음 모듈 내에서 클래스를 가져옵니다. 참조 : stackoverflow.com/a/6946467/4139249
Ratnanil

5

여기에 내가 제안한 것과는 다른 강력하고 강력한 방법이 있습니다.

이 모듈을 직접 사용하지는 않았지만 문제를 해결할 것이라고 생각합니다.

파이썬 모듈 리 로더

이 라이브러리는 Python 용 종속성 기반 모듈 리 로더를 구현합니다. 내장 reload () 함수와 달리이 리 로더는 요청 된 모듈과 해당 모듈에 종속 된 다른 모든 모듈을 다시로드합니다.

앞의 예에서, 이것은 한 번의 호출로 모든 종속성을로드해야합니다.

import reloader
reloader.enable()

import supporting_module

def execute()
  reloader.reload(supporting_module)
  ...

이 모듈을 처음 알게되었으므로 도구에서이 모듈을 구현하면 그 모듈이 얼마나 잘 작동하는지 다시 언급하십시오.


잘 찾아라! 표시된대로 정확하게 추가하면 작동합니다. .pyt 파일 자체가 변경되면 도구 상자에서 마우스 오른쪽 버튼을 클릭하고 새로 고침하면됩니다. 지원 모듈 및 해당 하위 모듈을 다시로드하고 있습니다. 그러나 한 가지주의 사항-때로는 설명 할 수없는 몇 가지 예외와 ArcMap 충돌이 발생했습니다 (ArcMap 충돌은 실제로 비정상적이지는 않지만 불행히도). 참고-지원 모듈과 하나의 종속 하위 모듈로만 테스트했습니다. 향후 안정성에 대해 다시보고 할 수 있습니다.
Josh Werts

1
보고 해 주셔서 감사합니다. 예, ArcMap을 운전할 때 때때로 충돌 테스트 더미처럼 느껴집니다.
cndnflyr

불행히도이 리 로더와 관련하여 너무 많은 안정성 문제가 발생하여 선택한 답변을 원래 reload () 내장 함수로 변경했습니다. 때로는 단순할수록 좋습니다!
Josh Werts
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.