python 은 from . import sth 과 import sth 의 차이가 존재한다. 하지만 이것을 뭐라고 부르는지 몰랐기 때문에, 각 동작의 차이도 이해할 수 없었고 어려워했다. 하지만 아주 간단하게도, 관련 내용은 PEP 328 에 명시되어 있다. 이 내용은 from . import sth 는 'relative import' , import sth 은 'absolute import' 라고 부르며, absolute import 은 top-level 패키지(참고5:패키지vs모듈) 를 시작으로 모듈을 찾아나가며, relative import 는 해당 모듈(참고5:패키지vs모듈) 이 위치해 있는 경로부터 탐색을 시작한다고 한다(참고4).
조금 더 자명하게 이해하기 위해 디렉토리 구조가 다음과 같은 상황을 생각해 보자.
.
├── project
│ ├── example
│ │ └── foo.py
│ └── run_inside_project.py
└── run_outside_project.py
Plain Text
복사
기본 상태
우리는 패키지를 임포트하는 방법의 핵심에 sys.path가 있다는 사실을 알고 있다(from1).
이 상황에서, foo.py 와 같은 디렉토리에 존재하는 foo_2.py 를 foo.py 에서 임포트해 사용하려면 어떻게 해야 할까? 단순히 foo.py 와 foo_2.py 가 같은 디렉토리에 있다고 해서 import foo_2 를 시전하면 아래 스크린샷과 같은 오류가 발생하게 된다. 그 이유는 sys.path 에 foo.py 가 위치해 있는 디렉토리가 존재하지 않기 때문이다(from1).
.
├── project
│ ├── example
│ │ ├── foo.py
│ │ └── foo_2.py
│ └── run_inside_project.py
└── run_outside_project.py
Plain Text
복사
이럴 때 sys.path 와 상관없이 foo.py 파일이 존재하는 경로부터 다시 탐색을 시작하는 relative import 를 사용할 수 있다. foo.py 파일에서 from . import foo_2 를 이용하면 sys.path 이 변하지 않았지만 foo_2.py 파일이 정상적으로 임포트됨을 알 수 있다.
from
참고
3.