Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 모듈 다시 로드하기 – importlib.reload() 완벽 가이드

Python에서 모듈 다시 로드하는 방법

Python 개발을 하다 보면 대화형 세션(인터프리터)에서 테스트 스크립트를 반복해서 실행하는 경우가 많습니다. 그런데 코드를 수정했음에도 불구하고 인터프리터가 계속 개발 중인 모듈의 첫 번째 버전만 사용하는 문제가 발생합니다. 이는 한 번 import된 모듈은 세션 종료 전까지 캐시된 상태로 유지되기 때문입니다. 이러한 상황에서 reload() 함수를 사용하면 모듈을 명시적으로 다시 로드하여 변경된 코드를 즉시 반영할 수 있습니다.

단, reload()에 전달되는 인수는 반드시 이전에 성공적으로 import된 모듈 객체여야 합니다.

기본 문법

import importlib
importlib.reload(sys)

Python 3.4 이상 버전에서는 내장 함수였던 reload()가 표준 라이브러리인 importlib 모듈로 이동했으므로, 반드시 importlib를 먼저 임포트해야 합니다.

사용 예제

>>> import sys
>>> import importlib
>>> importlib.reload(sys)
<module 'sys' (built-in)>

위 예제에서는 sys 모듈을 먼저 임포트한 후 다시 로드했기 때문에 정상적으로 동작합니다.

그러나 이전에 import된 적이 없는 모듈을 다시 로드하려고 하면 NameError 오류가 발생합니다.

>>> import importlib
>>> importlib.reload(sys)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
importlib.reload(sys)
NameError: name 'sys' is not defined

sys 모듈을 임포트하지 않은 상태에서 reload()를 호출했기 때문에 해당 이름이 정의되지 않았다는 오류가 발생한 것입니다.

reload() 실행 시 알아두어야 할 동작 원리

  • 모듈의 코드가 다시 컴파일되고 모듈 수준 코드가 재실행됩니다. 이 과정에서 원래 모듈을 로드했던 로더(loader)를 재사용하여 새로운 객체 집합이 정의되고, 모듈 딕셔너리의 이름들에 바인딩됩니다. 단, 모듈의 초기화(init) 함수는 다시 실행되지 않습니다.

  • 이전 객체들은 참조 카운트(reference count)가 0으로 떨어진 후에야 비로소 메모리에서 회수됩니다.

  • 모듈 네임스페이스 내의 이름들은 가능한 경우 새로운 객체로 갱신됩니다.

  • 이전 객체를 참조하던 외부 이름과 같은 다른 참조들이 자동으로 새 객체를 가리키도록 바뀌지는 않습니다. 따라서 필요하다면 해당 참조가 존재하는 각 네임스페이스에서 직접 업데이트해 주어야 합니다.

정리

importlib.reload()는 대화형 환경에서 모듈 코드 수정 사항을 빠르게 테스트할 때 매우 유용한 도구입니다. 다만 반드시 이전에 임포트된 모듈 객체에만 사용할 수 있으며, 외부 참조까지 자동으로 갱신되지 않는다는 점을 기억하면 예상치 못한 오류를 피할 수 있습니다.