[파이썬] `sys.meta_path`: 임포터 훅 목록 확인

sys.meta_path는 파이썬에서 임포터 훅(importer hook) 목록을 확인할 수 있는 어트리뷰트(attribute)입니다. 이 기능은 동적으로 모듈을 로드하고 커스텀 임포트 로직을 적용할 때 유용합니다.

파이썬의 import 문은 다음과 같은 단계를 따릅니다:

  1. 임포트할 모듈이 sys.modules 캐시에 있는지 확인합니다. 캐시에 있다면 더 이상의 로직은 수행하지 않고 해당 모듈을 가져옵니다.
  2. 캐시에 모듈이 없으면, sys.meta_path를 검사하여 임포터 훅 목록을 찾습니다.
  3. 찾은 임포터 훅 목록에서 순차적으로 find_module() 메서드를 호출하여 모듈을 찾습니다.
  4. 모듈이 발견되었다면, load_module() 메서드를 호출하여 모듈을 로드합니다.
  5. 로드된 모듈을 sys.modules 캐시에 저장합니다.

sys.meta_path를 통해 사용자 지정 임포터 훅을 등록하면, 모듈을 가져오는 과정에 개입할 수 있습니다. 이렇게 하면 모듈의 동적 로딩 및 다양한 커스텀 로직을 구현할 수 있습니다.

다음은 sys.meta_path를 사용하여 모듈을 동적으로 로드하는 예제 코드입니다:

import sys

class CustomImporter:
    def find_module(self, fullname, path=None):
        if fullname == 'custom_module':
            return self  # 모듈을 로드하기 위해 `load_module()` 메서드를 호출하기 위해 self를 반환합니다.

    def load_module(self, fullname):
        if fullname not in sys.modules:
            # 모듈을 동적으로 로드하는 로직을 구현합니다.
            # ...

            # 로드된 모듈을 sys.modules 캐시에 저장합니다.
            sys.modules[fullname] = my_loaded_module

        # 로드된 모듈을 반환합니다.
        return sys.modules[fullname]

# 커스텀 임포터를 `sys.meta_path`에 등록합니다.
sys.meta_path.append(CustomImporter())

# 커스텀 모듈을 가져옵니다.
import custom_module

위의 코드에서 CustomImporter 클래스는 임포터 훅으로 사용되며, 모듈 이름이 'custom_module'인 경우에만 관여합니다. find_module() 메서드에서 모듈을 찾고, load_module() 메서드에서 모듈을 실제로 로드합니다. 마지막으로, 로드된 모듈을 sys.modules 캐시에 저장하여 재사용할 수 있습니다.

sys.meta_path를 사용하면 파이썬의 임포트 메커니즘을 적극적으로 활용하여 동적인 모듈 로딩과 사용자 정의 임포트 로직을 쉽게 구현할 수 있습니다.