파이썬의 장점 중 하나는 동적 임포트 기능이 있어서 실행 중 모듈을 로드하여 사용할 수 있다는 것입니다. 하지만 동적 임포트를 사용할 때 발생할 수 있는 오류들이 존재합니다. 이번 포스팅에서는 파이썬 동적 임포트 오류의 종류와 그 해결 방법에 대해 알아보겠습니다.
소개
파이썬의 장점 중 하나는 모듈과 패키지를 사용하여 코드를 구조화할 수 있다는 것이다. 모듈간의 의존성을 해결하기 위해 상대 임포트나 절대 임포트를 사용할 수 있으며, 필요에 따라 동적으로 모듈을 로드하여 사용할 수 있는 기능을 제공합니다.
동적 임포트라는 이름에서 알 수 있듯이, 실행 중에 모듈을 로드하기 때문에 런타임 동안 모듈을 찾지 못할 경우에는 ImportError라는 예외가 발생합니다. 이번 포스팅에서는 동적 임포트 오류에 대한 처리 방법을 알아보겠습니다.
에러 메시지
해당 모듈 혹은 패키지를 찾을 수 없어서 발생하는 에러 메시지는 다음과 같습니다.
python
ImportError: No module named 'module_name'
만약 모듈 내부의 클래스, 함수, 변수를 찾을 수 없을 경우 다음과 같은 에러 메시지가 출력됩니다.
python
AttributeError: module 'module_name' has no attribute 'attribute_name'
상대 임포트
상대 임포트는 현재 모듈이 포함된 패키지를 기준으로 상대적인 위치에 있는 모듈을 임포트 하는 것입니다. 이때, 임포트하려는 모듈이 현재 모듈이 포함된 패키지와 같은 패키지 내부에 위치한 경우, 동적 임포트에서는 .
으로 구분해 상대 경로로 임포트할 수 있습니다.
예를 들어, 현재 모듈이 포함된 패키지가 example_package
이고 같은 패키지 내부에 utils
모듈이 위치하고 있다면 다음과 같이 임포트할 수 있습니다.
python
from . import utils
절대 임포트
절대 임포트는 모듈을 임포트할 때 모듈이 위치한 절대 경로를 사용하는 것입니다. 이때, 동적 임포트에서는 .
대신 패키지 이름을 사용합니다.
예를 들어, example_package
패키지 내부에 위치한 utils
모듈을 절대 임포트하는 경우 다음과 같이 사용합니다.
python
from example_package import utils
sys.path
동적 임포트가 실패하는 경우, 모듈이 위치한 디렉토리가 sys.path
에 없을 수 있습니다. 이때는 sys.path
에 모듈이 위치한 디렉토리를 추가하면 됩니다.
python
import sys
sys.path.append('/module/path/')
sys.path
리스트에 추가하려면 코드에서 직접 변경하는 것이 가장 간단하지만, 이를 임포트 모듈에 적용하려면 site-packages
디렉토리의 sitecustomize.py
파일을 수정하여야 합니다.
“`python
site-packages/sitecustomize.py
import sys
sys.path.append(‘/module/path/’)
“`
import()
(import()) 함수는 모듈의 이름을 문자열로 전달받아서 해당 모듈을 임포트합니다. 이 함수는 동적 임포트에서 사용됩니다.
python
module = __import__('module_name')
하지만 이 함수는 잘못 사용하면 여러 가지 문제를 발생시킵니다. 그래서 대부분의 경우에는 잘 사용하지 않는 것이 좋습니다.
importlib
Python 2.7부터 추가된 importlib
모듈은 인터프리터 런타임에서 모듈을 포함하고 있는 패키지를 다이나믹하게 임포트 하는 데 사용됩니다.
이 모듈을 사용하면 모듈의 경로와 경로에 포함된 패키지를 조회하고 수정할 수 있습니다.
python
import importlib
finder = importlib.util.find_spec('module_name') # 모듈이 포함된 경로를 가져옵니다.
module_info = importlib.util.module_from_spec(finder)
finder.loader.exec_module(module_info) # 모듈을 실행합니다.
결론
파이썬 동적 임포트 오류는 근본적으로 모듈이나 패키지를 찾지 못할 때 발생합니다. 임포트의 위치를 확실히 인지하고 모듈을 임포트 할 때 적절한 경로를 정확하게 지정하여 해결할 수 있습니다. 또한 sys.path
를 통해 디렉토리를 추가하거나 importlib
을 사용하여 다이나믹하게 모듈을 임포트 할 수 있습니다. 앞으로 동적 임포트 기능을 사용할 때 오류가 발생한다면 이 포스팅을 참고하여 해결하는 것이 좋습니다.