-
sys.modules & sys.path / absolute Path & relative PathPython 2021. 12. 5. 22:08
파이썬은 import를 통해 모듈과 패키지를 쉽게 사용할 수 있습니다.
파이썬이 모듈과 패키지를 찾는 순서는 다음과 같습니다.
1. sys.modules
2. built-in modules
3. sys.path
1. sys.modules
- 파이썬이 모듈과 패키지를 찾기 위해 가장 먼저 확인 하는 장소
- dictionary 형태의 자료구조로 경로를 나타낸다.
- 한 번 이상 사용되었거나 이미 내장되어 있는 module이나 패키지만 존재한다.
- ex) {모듈이름 : 모듈경로}
2. built-in modules
- 파이썬에서 제공하는 파이썬 공식 라이브러리들
- 이미 파이썬 설치때 포함되어 있기 때문에 따로 설치하지 않아도 사용 가능하다.
3. sys.path
- 만약 찾고자 하는 모듈과 패키지가 sys.modules 과 built-in modules에도 없으면 마지막으로 찾는 장소가 바로 sys.path이다.
- list 자료구조 형으로 경로를 나타낸다.
- 만약 이곳에서도 모듈과 패키지를 찾지 못한다면 ModuleNotFoundError 을 반환한다.
- ex) ['',
'/Users/song-eun-u/anaconda3/bin',
...]# sys도 패키지인데 import sys를 입력할 뿐 자세한 경로를 입력하지는 않습니다.
그 이유는 sys가 built-in modules이기 때문입니다.
# 경로
└── my_app
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py1. Absolute Path (절대경로)
- 최 상위 루트 디렉토리부터 파일의 위치까지의 모든 디렉토리의 경로를 표시하는 방법
- 웬만한 경우 Absolute path (절대경로)를 사용하는게 권장됩니다. (코드의 일관성 및 실수를 막고자)
ex) from package1 import module1
ex) from package1.module2 import function1
ex) from package2.subpackage1.module5 import function22. Relative Path (상대경로)
- 현재 위치해 있는 디렉토리를 기점으로 상대적으로 파일의 위치를 표현하는 방법
- 장점 : 선언해야 하는 경로의 길이를 줄여준다.
- 단점 : 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 한다.
ex) package1의 module1에서 package2의 module4의 class1과 subpackage1의 module5의 function1 함수를 import 할 경우
from ..package2.module4 import class1
from ..package2.subpackage1.module5 import function1
<추가 - 상대경로를 사용하는 경우> (21.12.10)
클론코딩을 하면서 상대경로를 통해서 import했다가 에러메세지를 마주한 적이 있었습니다. 그때 절대경로를 이용해서 문제를 해결했던 적이 있어서 상대경로는 무조건 안 좋은 것이니 가능하면 절대경로만 사용해야겠다고 생각하고 있었습니다.
그러던 중에 몇몇 블로그에서 이런 상대경로의 단점에도 불구하고 사용하는 이유에 대해서 써주신걸 봤습니다. 그래서 이에 대해 공유하고자 합니다.
"예를들어 filename.txt의 경로가 자주 바뀌거나 최초 디렉토리가 서로 다른 Windows와 Mac OS 모두에서 작동해야 하는 프로그램을 만드는 경우엔 그때 그때 경로를 다시 작성하거나 OS 별로 따로 관리해야 하는 것은 너무 비효율적인 일입니다.
그래서 이럴 때는 절대 경로가 아닌 상대 경로를 이용해 주어야 합니다."
제가 참고한 사이트인데 같이 읽어보시면 도움이 많이 될것 같습니다!
https://coding-kindergarten.tistory.com/82
'Python' 카테고리의 다른 글
Python dictionary get 메소드 vs Django objects get 메소드 (0) 2022.01.02 Python 용어 정리 (0) 2021.12.15 Function Parameter & Argument (0) 2021.12.09 ImportError 메세지 통해서 절대경로와 상대경로 구분하기 (0) 2021.12.06 파이썬 기초 (Data Types, Variable, Operation) (0) 2021.12.04