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.