파이썬 동적 임포트 오류 (Python dynamic import error) 알아보기.

파이썬의 장점 중 하나는 동적 임포트 기능이 있어서 실행 중 모듈을 로드하여 사용할 수 있다는 것입니다. 하지만 동적 임포트를 사용할 때 발생할 수 있는 오류들이 존재합니다. 이번 포스팅에서는 파이썬 동적 임포트 오류의 종류와 그 해결 방법에 대해 알아보겠습니다.

소개

파이썬의 장점 중 하나는 모듈과 패키지를 사용하여 코드를 구조화할 수 있다는 것이다. 모듈간의 의존성을 해결하기 위해 상대 임포트나 절대 임포트를 사용할 수 있으며, 필요에 따라 동적으로 모듈을 로드하여 사용할 수 있는 기능을 제공합니다.

동적 임포트라는 이름에서 알 수 있듯이, 실행 중에 모듈을 로드하기 때문에 런타임 동안 모듈을 찾지 못할 경우에는 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을 사용하여 다이나믹하게 모듈을 임포트 할 수 있습니다. 앞으로 동적 임포트 기능을 사용할 때 오류가 발생한다면 이 포스팅을 참고하여 해결하는 것이 좋습니다.