logo

Python에서 모듈 다시 로드

인터프리터를 다시 시작하지 않고 Python 모듈을 업데이트하고 테스트하려는 경우가 있습니다. 이는 개발 중에 모듈 파일을 외부에서 수정하고 해당 변경 사항이 즉시 반영되기를 원할 때 특히 유용합니다. Python에서는 reload() 함수를 사용하여 이전에 가져온 모듈을 다시 로드할 수 있습니다. 예를 들어 스크립트가 실행되는 동안 유틸리티 파일 utils.py를 편집한 경우 다시 로드하면 Python 셸을 다시 시작하지 않고도 업데이트된 콘텐츠를 다시 가져올 수 있습니다.

언제 모듈을 다시 로드해야 합니까?

  • 디버깅 또는 라이브 테스트 중
  • IPython이나 Jupyter와 같은 대화형 인터프리터를 사용하는 경우
  • 플러그인이나 모듈식 시스템을 개발하는 동안
  • 세션을 다시 시작하지 않고 외부 .py 파일의 변경 사항을 반영하려면

Python 2.x에서 모듈 다시 로드

Python 2.x에서는 내장된 reload() 함수를 직접 사용하여 이전에 가져온 모듈을 다시 로드할 수 있습니다.

Python
import mymodule # Modify 'mymodule.py' externally here... reload(mymodule) 

설명:



  • mymodule은 먼저 import를 사용하여 가져옵니다.
  • mymodule.py에 외부 변경을 수행한 후 reload(mymodule)를 호출하면 인터프리터를 다시 시작하지 않고 업데이트된 버전을 다시 로드합니다.
  • 다시 가져올 필요가 없습니다. reload()는 이미 가져온 모듈 객체에서 작동합니다.

Python 3.0에서 3.3으로 모듈 다시 로드

Python 버전 3.0~3.3에서는 내장 reload() 함수가 제거되었습니다. 대신 imp 모듈에서 가져와야 합니다.

Python
import mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule) 

설명:

  • 첫 번째 mymodule은 평소와 같이 가져옵니다.
  • imp 모듈은 이 버전 범위에서 reload() 기능을 제공합니다.
  • mymodule.py imp.reload(mymodule)을 편집한 후 업데이트된 변경 사항으로 모듈을 다시 로드합니다.

참고: imp 모듈은 Python 3.4부터 더 이상 사용되지 않으며 importlib로 대체되었습니다.

Python 3.4 이상에서 모듈 다시 로드

Python 3.4부터 모듈을 다시 로드하는 권장 방법은 importlib.reload()를 사용하는 것입니다.

Python
import mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule) 

설명:

  • mymodule은 먼저 정상적으로 가져옵니다.
  • 그런 다음 importlib.reload(mymodule)은 업데이트된 모듈을 다시 로드합니다.
  • 이는 Python 3.4+에서 모듈을 다시 로드하는 현재의 공식적인 방법입니다.

참고: 모듈 변경 사항을 테스트할 때 모든 최신 Python 스크립트 및 노트북에서 이 방법을 사용하세요.

Python에서 모듈을 언로드할 수 있습니까?

현재 Python은 모듈을 가져온 후 완전히 언로드하는 기본 제공 방법을 제공하지 않습니다. 모듈이 메모리에 로드되면 프로그램이 끝날 때까지 sys.modules에서 사용할 수 있는 상태로 유지됩니다. sys.modules에서 모듈을 삭제할 수 있지만 메모리에서 완전히 제거되거나 해당 참조가 사라진다는 보장은 없습니다.

Python
import mymodule import sys del sys.modules['mymodule'] 


이렇게 하면 sys.modules 캐시에서만 모듈이 제거됩니다. 변수나 개체가 여전히 모듈을 참조하는 경우 완전히 언로드되지 않습니다.

언로드가 지원되지 않는 이유는 무엇입니까?

  • Python은 메모리에서 전역적으로 모듈을 관리합니다.
  • 코드의 일부가 여전히 이전 모듈에 대한 참조를 보유하고 있는 경우 동적으로 언로드하면 일관되지 않은 동작이 발생할 수 있습니다.