Search
🔵

importlib 을 사용할 때에도 __package__ 를 지정할 수 있다.

🚀 prev note
♻️ prev note
🚀 next note
♻️ next note
17 more properties
importlib 은 프로그래밍적으로 임포트를 하는 도구이다. 프로그래밍적으로 임포트를 하는 도구란 무엇인지 이해를 돕기 위해 예를 들어 보자. A1.B1 하위에 module_000.py부터 module_999.py까지 1000개의 모듈이 있다. 각 모듈 이름들은 module_000, module_001, module_002 과 같은 일정한 패턴을 따른다. 이들을 모두 파일 최상단에서 불러오는 것이 아니라 특정 조건에 따라 필요한 모듈만 동적으로 로드하고자 할 때 사용할 수 있다.
import importlib module = importlib.import_module('A1.B1.module_005') if module: # 로드된 모듈에서 함수나 클래스 등을 사용할 수 있음 print('모듈 로드 성공:', module)
Python
복사
importlib 을 사용하는 경우
이 방법에서 A1.B1. 과 같이 임포트하는 이유는 패키지의 관계를 전달하여 __package__ 를 명시적으로 지정하기 위해서다. 때로는 모듈의 경로를 직접 지정하여 어떤 패키지의 하위 모듈로 처리할 것인지를 별도로 설정하고 싶을 수 있다. 이 경우, spec_from_file_location 함수를 사용한다. 이 함수는 프로그래머가 모듈의 절대 경로와 패키지 구조를 명시적으로 지정할 수 있게 해준다. 이 경우에도 package_structure__package__ 를 명시적으로 지정하기 위해서 사용된다는 것을 인지하는 것이 좋다.
import os import sys import importlib.util # 모듈의 상대 경로와 절대 경로를 정의한다. # 예를 들어, 'module_005.py' 모듈을 A1/B1 경로 아래에서 로드하려고 한다. relpath_from_package = 'A1/B1/module_005.py' abspath = '/absolute/path/to/A1/B1/module_005.py' # 예시 절대 경로 # './A1/B1/module_005.py' 와 같은 상대 경로는 사용하지 않는다. assert not relpath_from_package.startswith('./') package_structure = relpath_from_package.replace('.py', '').replace('/', '.') # 임포트를 위해 파일의 경로와 패키지 구조를 전달한다. spec = importlib.util.spec_from_file_location(package_structure, abspath) module = importlib.util.module_from_spec(spec) sys.modules[package_structure] = module spec.loader.exec_module(module) print(f'경로 `{abspath}`에서 모듈을 불러왔습니다.') print(f'패키지 구조는 `{package_structure}`입니다.')
Python
복사
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
1.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
1.
__package__ 가 무엇인지는 앞의 글을 참고하라.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
1.
None
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는지 연결합니다.
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되거나 이어지는지를 작성하는 영역입니다.
1.
None
ref : 생각에 참고한 자료입니다.
1.
None