built-in 모듈과 pip
와 같은 package manager로 설치한 module/package와 달리, 사용자가 직접 작성한 module/package를 import하기 위해서는 module이 위치한 경로를 알려줘야합니다.
경로를 선언하는 방법에는 absolute path와 relative 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
를 추가시켜주거나 상대경로를 활용해야 한다.
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
-> 처음부터 절대경로로 작성하는 것이 낫겠다.