importlib — import의 구현

importlib — import의 구현

importlib 패키지는 Python의 import 문의 구현을 제공해요. 이 패키지는 두 가지 목적을 가집니다:

  1. Python 소스에서 import 메커니즘의 (Python으로 작성된) 구현을 제공합니다.
  2. import 메커니즘을 이해하거나 확장할 수 있는 구성 요소를 노출합니다.

importlib의 가장 직접적인 용도는 import_module() 함수로, 모듈 이름 문자열로부터 모듈을 임포트하는 데 사용돼요.

출처: Python 표준 라이브러리

import_module()

  • importlib.import_module(name, package=None)

name이 가리키는 모듈을 임포트해요. package는 상대 임포트(예: import_module('.submodule', package='pkg'))에서 기준이 되는 패키지 이름입니다. 성공하면 그 모듈을 반환하고, 실패하면 ImportError를 발생시켜요.

>>> import importlib
>>> math = importlib.import_module('math')
>>> math.sqrt(16)
4.0

importlib.util

importlib.util은 임포트 구현에 유용한 유틸리티 함수들을 제공해요:

  • importlib.util.find_spec(name, package=None) — 모듈의 스펙(spec)을 찾아 반환해요. 찾지 못하면 None입니다.
  • importlib.util.module_from_spec(spec) — 주어진 스펙에서 새 모듈 객체를 만들어요.
  • importlib.util.resolve_name(name, package) — 상대 모듈 이름을 절대 이름으로 해석해요.
  • importlib.util.spec_from_loader(name, loader, *, origin=None, ...) — 로더에서 모듈 스펙을 만들어요.

예제 — 스펙을 통해 모듈을 로드하는 패턴:

import importlib.util
import sys

spec = importlib.util.spec_from_file_location("example", "/path/to/example.py")
module = importlib.util.module_from_spec(spec)
sys.modules["example"] = module
spec.loader.exec_module(module)

또한 importlib.util.find_spec은 모듈을 실제로 임포트하지 않고 존재 여부·위치를 확인하고 싶을 때 유용합니다.

importlib.machinery

importlib.machinery는 임포트 시스템의 다양한 "머신" 구성 요소를 제공해요. 가장 중요한 것들:

  • importlib.machinery.SourceFileLoader — 파이썬 소스 파일을 로드하는 로더.
  • importlib.machinery.SourcelessFileLoader — 소스 없는(바이트코드 .pyc) 파일 로더.
  • importlib.machinery.ExtensionFileLoader — 확장 모듈(.so, .pyd) 로더.
  • importlib.machinery.PathFindersys.path에서 모듈을 찾는 파인더.
  • importlib.machinery.SourceFileLoaderload_module() 등.

임포트 시스템의 파인더/로더가 어떻게 협력하는지는 이 모듈의 클래스 계층으로 이해할 수 있어요. 예를 들어 .py 소스 파일용으로 SourceFileLoader, .pyc용으로 SourcelessFileLoader가 사용됩니다.

importlib.resources

importlib.resources는 패키지 안의 리소스 파일(비코드 파일)에 접근하는 현대적 API를 제공해요. Python 3.9 이후 권장되는 방식입니다.

  • importlib.resources.files(package) — 패키지의 리소스 트리를 나타내는 Traversable 객체를 반환해요.
  • importlib.resources.as_file(traversable) — 경로처럼 사용할 수 있는 실제 파일 맥락을 제공.
  • importlib.resources.read_text(package, resource, encoding='utf-8') — 텍스트 리소스를 읽어요.
from importlib import resources

# 패키지 안의 data.txt 리소스 읽기
text = resources.files('mypkg').joinpath('data.txt').read_text()

importlib.metadata

importlib.metadata는 설치된 패키지의 메타데이터에 접근하는 API를 제공해요. importlib.metadata.PackageDistribution과 핵심 함수들이 있습니다.

  • importlib.metadata.version(distribution_name) — 설치된 배포판의 버전 문자열을 반환.
  • importlib.metadata.metadata(distribution_name) — 배포판의 메타데이터(메시지)를 반환.
  • importlib.metadata.distribution(distribution_name)PackageDistribution 객체를 반환.
  • importlib.metadata.requires(distribution_name) — 의존성 요구사항 목록.
>>> import importlib.metadata
>>> importlib.metadata.version('pip')
'25.0'

importlib.metadata.PackageDistribution.metadata['Summary']처럼 메타데이터 필드에 접근하거나, .read_text('METADATA')로 원문을 읽을 수 있습니다.

예제

디렉터리에서 모듈 로드하기

지정한 경로에서 파이썬 파일을 모듈로 로드하는 완전한 예:

import importlib.util
import sys

def load_module(name, path):
    """경로에서 모듈을 동적으로 로드"""
    spec = importlib.util.spec_from_file_location(name, path)
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    return module

my_mod = load_module('my_mod', '/path/to/my_mod.py')
print(my_mod.some_function())

importlib.metadata 사용

from importlib.metadata import distribution

d = distribution('requests')
print(d.version)
for req in d.requires or []:
    print(req)

더 알아보기