importlib은 파이썬의 동적 임포트 기능을 제공하는 것으로 처음부터 import할 라이브러리를 확정짓고 시작하는 것 아니라, Runtime에서 경우에 따라 모듈 이름을 결정할 수 있다는 이점이 있다.
코드 작성할 때가 아닌 Runtime에서 모듈 이름이 결정된다는 점에서 동적 임포트라고 하는 것이다.
일반 import 문은 코드 작성 시 모듈 이름을 알고 있어야 한다.
반면 importlib을 사용하면 런타임에 모듈 이름을 결정할 수 있다.
import importlib
module_name = input("Import which module? ")
module = importlib.import_module(module_name)
이러한 동적 임포트는 플러그인 시스템이나 설정에 따라 다른 모듈을 로드해야 할 때 매우 유용하다는 장점이 있다.
특정 조건에 따라 모듈을 임포트할 수 있다.
if some_condition:
module = importlib.import_module('module_a')
else:
module = importlib.import_module('module_b')
importlib을 사용하면 임포트 과정에서 발생할 수 있는 예외를 더 세밀하게 제어할 수 있다.
try:
module = importlib.import_module('some_module')
except ImportError:
print("Module not found, using fallback")
module = importlib.import_module('fallback_module')
fall_back(또는 fallback)은 주로 소프트웨어 개발과 시스템 설계에서 사용되는 개념으로, 기본 계획이나 선호하는 옵션이 실패하거나 사용할 수 없을 때 대체 방안으로 사용되는 대안을 의미한다.
importlib.reload() 함수를 사용하면 이미 임포트된 모듈을 다시 로드할 수 있다.
개발 중 코드 변경사항을 적용할 때 유용한 점이 있다.
import some_module
# some_module 수정 후
importlib.reload(some_module)
importlib.util.spec_from_file_location()을 사용하여 특정 파일에서 모듈을 임포트할 수 있다.
spec = importlib.util.spec_from_file_location("module_name", "/path/to/file.py")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
이는 표준 임포트 경로 외부의 모듈을 로드할 때 유용합니다.
구체적으로
1.spec = importlib.util.spec_from_file_location("module_name", "/path/to/file.py")
이 라인은 모듈 스펙(specification)을 생성한다.
module = importlib.util.module_from_spec(spec)
이 라인은 생성된 스펙을 기반으로 새로운모듈 객체를 만든다. 다만, 아직 해당 모듈 객체는 실행되지 않았다. 즉, 모듈의 네임스페이스는 준비되었지만, 모듈의 코드는 실행되지 않은 것.
spec.loader.exec_module(module)
이 라인은 실제 모듈의 코드를 실행한다. 이때exec_module메소드는 모듈의 전역 네임스페이스에서 모듈의 코드를 실행하고, 이 과정을 통해 모듈의 전역 변수들이 정의되고 초기화된다.
def load_plugin(plugin_name):
return importlib.import_module(f'plugins.{plugin_name}')
plugin = load_plugin(user_selected_plugin)
plugin.run()
사용자가 선택한 플러그인을 동적으로 로드할 수 있어, 확장 가능한 애플리케이션 구조를 만들 수 있다.
config = load_config()
database_module = importlib.import_module(config['database_module'])
db = database_module.connect(config['database_url'])
설정 파일에 따라 다른 데이터베이스 모듈을 사용할 수 있어, 애플리케이션의 유연성이 크게 향상됨
def test_with_mock():
sys.modules['real_module'] = mock_module
importlib.reload(module_under_test)
# 테스트 실행
단위 테스트에서 특정 모듈을 모의 객체로 대체할 수 있어, 격리된 테스트 환경을 만들 수 있다.
try:
module = importlib.import_module('module_v2')
except ImportError:
module = importlib.import_module('module_v1')
여러 버전의 모듈을 지원해야 할 때, 사용 가능한 최신 버전을 자동으로 선택할 수 있다.
importlib을 사용하면 위와 같이 동적이고 유연한 임포트 전략을 구현할 수 있어서 더 강력하고 적응력 있는 파이썬 애플리케이션을 개발할 수 있다.
특히 대규모 프로젝트나 확장 가능한 시스템을 설계할 때 importlib의 기능이 많이 쓰인다.