importlib — import의 구현
importlib — import의 구현
importlib 패키지는 Python의 import 문의 구현을 제공해요. 이 패키지는 두 가지 목적을 가집니다:
- Python 소스에서
import메커니즘의 (Python으로 작성된) 구현을 제공합니다. 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.PathFinder—sys.path에서 모듈을 찾는 파인더.importlib.machinery.SourceFileLoader의load_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)
더 알아보기
- Python 언어 레퍼런스의 import 시스템 설명
- Python 표준 라이브러리의
pkgutil,runpy모듈 - Python 공식 문서: importlib