Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python의 절대 임포트와 상대 임포트 완벽 이해하기


파이썬으로 개발을 하다 보면 다른 파이썬 파일이나 패키지에 작성된 코드를 불러와 사용해야 하는 경우가 자주 발생합니다. 이때 필요한 것이 바로 임포트(import)입니다. 가장 간단한 방법은 현재 프로그램의 상단에 아래와 같은 문장을 작성하는 것입니다.

import package_name 또는 module_name
또는
from package_name import module_name/object_name

위 문장이 해석될 때 인터프리터는 다음과 같은 순서로 동작합니다.

  • 먼저 이전에 이미 임포트된 모든 모듈의 캐시(sys.modules)에서 해당 이름을 찾습니다.

  • 1단계에서 찾지 못하면 파이썬 표준 라이브러리에 포함된 내장 모듈 목록에서 검색합니다.

  • 그래도 찾지 못하면 sys.path에 정의된 디렉터리 목록(현재 디렉터리가 첫 번째 검색 대상)에서 패키지나 모듈 이름을 찾습니다.

  • 위 단계 중 하나에서 모듈을 찾으면, 해당 패키지나 모듈의 이름이 현재 프로그램의 지역 범위(local scope)에 바인딩됩니다.

  • 모든 단계에서도 찾지 못하면 ModuleNotFoundError 예외가 발생합니다.

임포트 시 지켜야 할 규칙

임포트 문은 해당 문을 사용하는 파일의 최상단에 작성하는 것이 좋으며, 권장되는 작성 순서는 아래와 같습니다.

  • 파이썬 표준 라이브러리 모듈

  • 서드파티(외부) 모듈

  • 로컬 애플리케이션 모듈

절대 임포트(Absolute Import)

절대 임포트는 임포트할 패키지·모듈·함수의 전체 경로를 명시하는 방식입니다. 디렉터리 구조를 나타낼 때는 슬래시(/) 대신 점(.)을 사용합니다.

예를 들어 다음과 같은 패키지 구조가 있다고 가정해 보겠습니다.

python_project_name/packageA/moduleA1.py
python_project_name/packageA/moduleA2.py

moduleA2에 myfunc라는 함수가 있고, 이 함수를 현재 파이썬 프로그램으로 가져오고 싶다면 절대 경로를 사용해 다음과 같이 작성합니다.

from packageA.moduleA2 import myfunc

절대 임포트의 가장 큰 장점은 어디에서 무엇을 임포트하는지 명확하게 드러난다는 점입니다. 반면 경로가 길어져 코드가 다소 장황해질 수 있다는 단점이 있습니다.

상대 임포트(Relative Import)

상대 임포트는 현재 스크립트의 위치를 기준으로 임포트할 패키지의 경로를 상대적으로 표기하는 방식입니다. 마침표 하나(.)는 현재 위치에서 한 단계 위 디렉터리를, 마침표 두 개(..)는 두 단계 위 디렉터리를 의미하며, 이후 같은 방식으로 확장됩니다.

다음과 같은 패키지 구조를 살펴보겠습니다.

python_project_name/packageA/moduleA1.py
python_project_name/packageB/moduleB1.py

packageB의 moduleB1이 moduleA1을 임포트해야 한다면 임포트 문은 다음과 같습니다.

from ..packageA import moduleA1

여기서 마침표 두 개(..)는 moduleB1의 위치에서 한 단계 위인 python_project_name 디렉터리로 이동한 뒤, packageA로 들어가 moduleA1을 가져오라는 의미입니다.

상대 임포트는 경로가 짧고, 최상위 프로젝트를 다른 위치로 옮겨도 임포트 문의 경로를 수정하지 않아도 된다는 장점이 있습니다. 하지만 여러 곳에서 임포트 폴더를 공유하는 경우에는 경로에 변경이 생기면 코드가 쉽게 영향을 받을 수 있다는 단점이 있습니다.