importlib — `import`의 구현
importlib — import의 구현
importlib 패키지의 목적은 세 가지예요. 하나는 파이썬 소스 코드에서 import 문(그리고 결과적으로 __import__() 함수)의 구현을 제공하는 것이에요. 이는 어떤 파이썬 인터프리터에도 이식 가능한 import 구현을 제공해요. 둘째, import를 구현하는 구성 요소가 이 패키지에 노출되어, 사용자가 가져오기 과정에 참여하는 자체 사용자 지정 객체(일반적으로 importer로 알려짐)를 더 쉽게 만들 수 있게 해줘요. 셋째, 패키지는 파이썬 패키지 관리 측면을 위한 추가 기능을 노출하는 모듈을 포함해요:
importlib.metadata는 제3자 배포의 메타데이터에 대한 접근을 제공해요.importlib.resources는 파이썬 패키지에서 비코드 “리소스”에 접근하는 루틴을 제공해요.
버전 3.1에서 추가됨.
본문
함수
importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0) — 내장 __import__() 함수의 구현이에요. 모듈 프로그래밍 방식 가져오기에는 대신 import_module()을 사용해야 해요.
importlib.import_module(name, package=None) — 모듈을 가져와요. name 인자는 절대 또는 상대 용어로 가져올 모듈을 지정해요(예: pkg.mod 또는 ..mod). 상대 용어로 지정되면 package 인자는 패키지 이름의 앵커 역할을 하는 패키지 이름으로 설정해야 해요. import_module() 함수는 importlib.__import__() 주변의 단순화 래퍼 역할을 해요. 두 함수의 가장 중요한 차이는 import_module()은 지정된 패키지 또는 모듈(예: pkg.mod)을 반환하는 반면 __import__()는 최상위 패키지 또는 모듈(예: pkg)을 반환한다는 점이에요.
import importlib
itertools = importlib.import_module('itertools')
importlib.invalidate_caches() — sys.meta_path에 저장된 finder의 내부 캐시를 무효화해요. 프로그램 실행 중 모듈이 생성·설치되면 모든 finder가 새 모듈의 존재를 알도록 호출해야 해요. 버전 3.3에서 추가됨.
importlib.reload(module) — 이전에 가져온 모듈을 다시 로드해요. 인자는 모듈 객체여야 하므로 이전에 성공적으로 가져왔어야 해요. 외부 에디터로 모듈 소스 파일을 편집한 후 파이썬 인터프리터를 떠나지 않고 새 버전을 시험해 보려 할 때 유용해요. 반환값은 모듈 객체예요.
reload() 실행 시: 파이썬 모듈의 코드가 재컴파일되고 모듈 수준 코드가 재실행되며, 모듈을 원래 로드한 로더를 재사용해 모듈의 딕셔너리 이름에 바인딩되는 새 객체 집합이 정의돼요. 이 함수는 스레드 안전하지 않아요.
importlib.abc — import 관련 추상 기본 클래스
class importlib.abc.MetaPathFinder — 메타 경로 finder를 나타내는 추상 기본 클래스. find_spec(fullname, path, target=None) — 지정된 모듈에 대한 spec을 찾는 추상 메서드. 버전 3.3에서 추가됨.
class importlib.abc.PathEntryFinder — 경로 항목 finder를 나타내는 추상 기본 클래스. importlib.machinery.PathFinder가 제공하는 경로 기반 import 하위 시스템 내에서만 사용하기 위한 것이에요.
class importlib.abc.Loader — 로더를 위한 추상 기본 클래스. create_module(spec), exec_module(module), load_module(fullname) 메서드를 정의해요.
class importlib.abc.ResourceLoader — 스토리지 백엔드에서 임의의 리소스를 로드하기 위한 선택적 PEP 302 프로토콜을 구현하는 로더의 추상 기본 클래스. 버전 3.7에서 TraversableResources를 선호해 폐기됨.
class importlib.abc.InspectLoader — 모듈을 검사하는 로더를 위한 선택적 PEP 302 프로토콜을 구현하는 로더의 추상 기본 클래스. get_code(fullname), get_source(fullname), is_package(fullname), source_to_code(data, path='<string>') 메서드를 제공해요.
class importlib.abc.ExecutionLoader — 구현 시 모듈이 스크립트로 실행되는 데 도움을 주는 InspectLoader를 상속하는 추상 기본 클래스. get_filename(fullname) 메서드를 정의해요.
class importlib.abc.FileLoader(fullname, path) — ResourceLoader와 ExecutionLoader를 상속해 ResourceLoader.get_data()와 ExecutionLoader.get_filename()의 구체적인 구현을 제공하는 추상 기본 클래스.
class importlib.abc.SourceLoader — 소스(및 선택적으로 바이트코드) 파일 로딩을 구현하기 위한 추상 기본 클래스. get_data(), get_filename() 외에도 선택적 바이트코드 지원을 위한 path_stats(path), path_mtime(path), set_data(path, data) 메서드를 제공해요.
importlib.machinery — importer와 경로 훅
이 모듈은 import가 모듈을 찾고 로드하는 데 도움을 주는 다양한 객체를 포함해요.
상수: SOURCE_SUFFIXES, BYTECODE_SUFFIXES, EXTENSION_SUFFIXES, all_suffixes().
클래스:
class importlib.machinery.BuiltinImporter— 내장 모듈용 importer.class importlib.machinery.FrozenImporter— 동결(frozen) 모듈용 importer.class importlib.machinery.PathFinder—sys.path및 패키지__path__속성용 Finder.class importlib.machinery.FileFinder(path, *loader_details)— 파일 시스템 결과를 캐시하는importlib.abc.PathEntryFinder의 구체적인 구현.class importlib.machinery.SourceFileLoader(fullname, path)—importlib.abc.SourceLoader의 구체적인 구현.class importlib.machinery.SourcelessFileLoader(fullname, path)— 바이트코드 파일을 import할 수 있는importlib.abc.FileLoader의 구체적인 구현.class importlib.machinery.ExtensionFileLoader(fullname, path)— 확장 모듈용importlib.abc.ExecutionLoader의 구체적인 구현.class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)— 모듈의 import 시스템 관련 상태에 대한 사양. 보통 모듈의__spec__속성으로 노출돼요.
importlib.util — importer를 위한 유틸리티 코드
이 모듈은 importer 구축에 도움이 되는 다양한 객체를 포함해요.
importlib.util.MAGIC_NUMBER— 바이트코드 버전 번호를 나타내는 bytes.importlib.util.cache_from_source(path, debug_override=None, *, optimization=None)— 소스 경로와 관련된 바이트컴파일 파일의 PEP 3147/PEP 488 경로를 반환해요.importlib.util.source_from_cache(path)— PEP 3147 파일 이름의 경로가 주어지면 관련 소스 코드 파일 경로를 반환해요.importlib.util.decode_source(source_bytes)— 소스 코드를 나타내는 주어진 바이트를 디코딩하고 유니버설 뉴라인이 있는 문자열로 반환해요.importlib.util.resolve_name(name, package)— 상대 모듈 이름을 절대 이름으로 해석해요.importlib.util.find_spec(name, package=None)— 모듈에 대한 spec을 찾아요.importlib.util.module_from_spec(spec)—spec과spec.loader.create_module을 기반으로 새 모듈을 만들어요.importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)— 로더를 기반으로ModuleSpec인스턴스를 만드는 팩토리 함수.importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)— 파일 경로를 기반으로ModuleSpec인스턴스를 만드는 팩토리 함수.class importlib.util.LazyLoader(loader)— 모듈의 속성에 접근할 때까지 로더의 실행을 연기하는 클래스.classmethod factory(loader).
예시
프로그래밍 방식 가져오기 — importlib.import_module()을 사용해요.
모듈을 가져올 수 있는지 확인하기 — 실제로 import하지 않고 모듈을 가져올 수 있는지 확인하려면 importlib.util.find_spec()을 사용해요.
소스 파일 직접 가져오기 — 경로에서 파이썬 소스 파일을 직접 가져오려면 다음 레시피를 사용해요:
import importlib.util
import sys
def import_from_path(module_name, file_path):
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)
return module
지연 import 구현하기 — LazyLoader를 사용해 지연 import를 구현할 수 있어요.
참고
- import 문 — 언어 참조.
- 패키지 사양 — 원본 사양.
__import__()함수.- PEP 302 — 새 import 훅.