본문 바로가기
Python

importlib (파이썬 라이브러리)

by yororing 2024. 7. 5.

00 개요

  • importlib가 어떤 패키지/라이브러리인지 정리하고자함

01 importlib 

1. 정의

  • importlib은 Python 내장 라이브러리
  • 동적 모듈 가져오기 및 관련 기능을 제공하는 라이브러리
  • importlib을 사용하면 프로그램 실행 중에 모듈을 가져오거나 재로드 가능
  • import 문을 대신하여 모듈을 가져오는 데 사용될 수 있으며, 더 복잡한 가져오기 요구 사항을 처리하는 데 유용

2. 3가지 목적

1) import 문 구현 기능 제공

  • One is to provide the implementation of the import statement (and thus, by extension, the __import__() function) in Python source code
  • This provides an implementation of import which is portable to any Python interpreter.
  • This also provides an implementation which is easier to comprehend than one implemented in a programming language other than Python.

2) import의 요소 수정 기능 제공

  • The components to implement import are exposed in this package, making it easier for users to create their own custom objects (known generically as an importer) to participate in the import process.

3) Python 패키지들 관리 기능 제공 

  • The package contains modules exposing additional functionality for managing aspects of Python packages:
    • importlib.metadata presents access to metadata from third-party distributions.
    • importlib.resources provides routines for accessing non-code “resources” from Python packages.

2. 주요 기능

1) 모듈 가져오기

  • importlib.import_module(name, package=None) 함수를 사용하여 주어진 이름(name)의 모듈 가져오기
import importlib

importlib.import_module(name, package=None)

# 예시
math_module = importlib.import_module('math')
print(math_module.sqrt(16))  # Output: 4.0

2) 모듈 재로드

  • importlib.reload(module) 함수 사용하여 이미 가져온 모듈을 다시 로드하기
  • 이는 주로 개발 중에 모듈을 수정한 후 변경 사항을 반영하기 위해 사용됨
import importlib
import my_module

# my_module을 수정한 후
importlib.reload(my_module)

3) 모듈 사양/메타데이터 접근 (access to spec/metadata)

  • importlib.util.find_spec(name, package=None) 함수 사용하여 주어진 이름의 모듈 사양 찾기
  • 이 사양은 모듈의 메타데이터를 포함
import importlib.util    # import importlib 아님 주의!

spec = importlib.util.fine_spec('json')
print(spec)

  • NOTE: import 시 importlib.util이 아닌 importlib만 할 시 에러남

4) 모듈 생성 및 실행

  • importlib.util.module_from_spec(spec) spec.loader.exec_module(module)를 사용하여 모듈을 동적으로 생성 및 실행하기
import importlib.util

spec = importlib.util.find_spec('math')
math_module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(math_module)
print(math_module.sqrt(25))  # Output: 5.0

5) 기타 도구

  • importlib.util.resolve_name(name, package): 상대 모듈 이름을 절대 이름으로 변환
  • importlib.util.spec_from_file_location(name, location): 파일 위치에서 모듈 사양을 생성

3. importlib의 장점

  • 동적 가져오기: 런타임에 모듈을 동적으로 가져와야 할 때 유용
  • 모듈 재로드: 변경된 모듈을 다시 로드하여 개발 중에 변경 사항을 반영가능
  • 모듈 메타데이터 접근: 모듈의 메타데이터를 조회 가능
  • 모듈 생성 및 실행 제어: 모듈을 동적으로 생성 및 제어 가능

4. 예시

  • importlib 사용하여 모듈을 동적으로 가져오고, 재로드하며, 모듈의 메타데이터를 조회하기
import importlib
import time

# 모듈 동적 가져오기
os_module = importlib.import_module('os')
print(os_module.name)  # Output: posix (or nt on Windows)

# 모듈 재로드
time_module = importlib.import_module('time')
print(time_module.time())
time.sleep(2)
importlib.reload(time_module)
print(time_module.time())

# 모듈 사양 조회
spec = importlib.util.find_spec('json')
print(spec)

02 결론

  • importlib은 Python의 동적 모듈 가져오기 및 관련 기능을 제공하는 강력한 라이브러리
  • 이 라이브러리를 사용하면 런타임에 모듈을 가져오고, 재로드하며, 모듈의 메타데이터를 조회 가능
  • importlib은 특히 복잡한 가져오기 요구 사항을 처리해야 할 때 유용

 

참조

  1. https://docs.python.org/3/library/importlib.html 
  2. (소스 코드) https://github.com/python/cpython/blob/3.12/Lib/importlib/__init__.py
  3.