직접 개발한 local package를 import 할때는 해당 package의 위치에 맞게 import 경로를 잘 선언해야 합니다. Local package를 import 하는 경로에는 absolute path 와 relative path 가 있습니다.

다음과 같은 디렉토리가 있다고 가정하겠습니다.

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py

my_app 이라는 프로젝트 이며 package1과 package2 라는 2개의 package를 가지고 있습니다.
그리고 package2는 subpackage2 라는 중첩 package를 가지고 있습니다.

1. Absolute Path

Absolute path를 사용해 package1 과 package2를 import 하면 다음과 같습니다.

from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

경로들의 시작점이 전부 "my_app" 프로젝트의 가장 최상위 디렉토리에서 시작하는것을 볼 수 있습니다.

subpackage1의 module5 모듈의 function2 함수를 import 하기 위해서는 다음 경로를 거치게 됩니다.

my_app/package2/subpackage1/module5.py

Python에서는 .(dot notation)을 사용합니다.

my_app.package2.subpackage1.module5.py

이미 my_app 프로젝트 안에 있으므로 my_app 은 생략됩니다. 그러므로 다음처럼 경로를 표현하게 되는 것입니다.

package2.subpackage1.module5.py

2. Relative Path

Relative path 는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의합니다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용됩니다.

예를 들어, package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import하려고 하면 다음 처럼 할 수 있습니다.

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2           #여기의 class1을 import하려고 함.
        ├── __init__.py
        ├── module3.py     #여기서
        ├── module4.py
        └── subpackage1 
            └── module5.py #여기의 function2를 import하려고 함.
# package2/module3.py

from . import class1
from .subpackage1.module5 import function2

여기서 .은 현재 위치를 나타냅니다.


또한 dot 2개를 사용할 수도 있습니다. dot 2개(..) 는 현재위치에서 상위 디렉토리로 가는 경로입니다.

만약, module5.py에서 module4에 있는 class4를 import하려고 한다면 다음과 같이 나타낼수 있습니다.

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2           
        ├── __init__.py
        ├── module3.py     
        ├── module4.py     #여기의 class4를 import하려고 함.
        └── subpackage1 
            └── module5.py #여기서
# subpackage1/module5.py
from ..module4 import class4

Relative Path는 디렉토리의 위치가 바뀔때마다 코드를 바꿔줘야 하므로 좋은 방법은 아닙니다. 웬만한 경우 absolute path를 사용하는게 권장 됩니다.