[Python] Absolute Path & Relative Path

이동명·2021년 6월 11일
0

built-in 모듈과 pip와 같은 package manager로 설치한 module/package와 달리, 사용자가 직접 작성한 module/package를 import하기 위해서는 module이 위치한 경로를 알려줘야합니다.

경로를 선언하는 방법에는 absolute pathrelative path 가 존재합니다.

1. Absolute Path

absolute path(절대경로)는 main으로 실행되는 script가 위치한 directory를 기준으로 모듈의 경로를 지정하는 방식이다.

└── project
    ├── main.py
    ├── package1
    │   ├── module11.py
    │   └── module12.py
    └── package2
        ├── __init__.py
        ├── module21.py
        ├── module22.py
        └── subpackage1
            └── module3.py
  • 프로젝트 폴더 바로 아래에 main으로 실행되는 script가 위치하기 마련인데,
    위에 예시로 든 경로에서 main.py가 아닌 하위 폴더에 위치한 module11.py를 main으로 실행시키면서 같은 프로젝트안의 Package인 package.module21을 import한다면 오류가 발생할 수 있다.
  • 이는 파이썬이 모듈을 찾는 위치인 sys.path/project가 아닌 /project/package1으로 세팅되기 때문이다.
  • 따라서, test를 위해 프로젝트안의 하위폴더에서 파일을 main으로 실행시키기 위해서는 PYTHONPATH에 /project를 추가시켜주거나 상대경로를 활용해야 한다.

2. Relative Path

relative path(상대경로)는 실행되는 script 파일이 위치한 경로를 기준으로 path를 표시하는 방법이다.

폴더/파일의 위치가 변경되면 오류가 발생하기 때문에, 되도록이면 절대경로를 사용하는 것이 좋다.

  • dot 1개 . 는 script가 위치한 경로를 나타낸다.
  • dot 2개 .. 는 현재위치에서 상위 디렉토리를 나타낸다.
  • 그보다 한단계 더 상위 디렉토리로 가고싶으면 ... dot 3개를 쓰면 된다.

Relative Import는 현재 모듈의 이름에 기반한다.

  • 따라서, main으로 실행되는 script는 __name__ = "__main__"으로 변경되기 때문에, 상대경로를 찾을 수 없다.
  • main으로 실행되는 파일에서는 항상 절대경로를 이용하여 import 해야한다.
    (참고자료) : https://docs.python.org/3/tutorial/modules.html#intra-package-references
  • 상대경로를 이용해 import한 파일의 경우에, test를 위해 main파일로 실행할 경우가 발생하는데, 이때 위와 같은 이유로 인해 아래와 같은 ImportError가 발생한다.
    ImportError: attempted relative import with no known parent package
    -> 처음부터 절대경로로 작성하는 것이 낫겠다.

0개의 댓글