importlib — `import`의 구현

importlib — import의 구현

importlib 패키지의 목적은 세 가지예요. 하나는 파이썬 소스 코드에서 import 문(그리고 결과적으로 __import__() 함수)의 구현을 제공하는 것이에요. 이는 어떤 파이썬 인터프리터에도 이식 가능한 import 구현을 제공해요. 둘째, import를 구현하는 구성 요소가 이 패키지에 노출되어, 사용자가 가져오기 과정에 참여하는 자체 사용자 지정 객체(일반적으로 importer로 알려짐)를 더 쉽게 만들 수 있게 해줘요. 셋째, 패키지는 파이썬 패키지 관리 측면을 위한 추가 기능을 노출하는 모듈을 포함해요:

  • importlib.metadata는 제3자 배포의 메타데이터에 대한 접근을 제공해요.
  • importlib.resources는 파이썬 패키지에서 비코드 “리소스”에 접근하는 루틴을 제공해요.

버전 3.1에서 추가됨.

출처: Python documentation

본문

함수

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)ResourceLoaderExecutionLoader를 상속해 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.PathFindersys.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)specspec.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 훅.

더 알아보기 (Learn more)