import search 순서
sys.modules -> built-in modules -> sys.path
sys.modules
- 파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳.
- sys.modules은 단순한 dictionary형태.
- 이미 import된 모듈과 package를 저장하고 있음.
- import가 되어있는 모듈과 패키지의 경로가 저장되어 있어 다시 찾지 않아도 된다.
sys.path
- 파이썬이 마지막으로 보는 곳.
- sys.path는 기본적으로 list형태이며 string 요소들을 가지고 있는 list
- 각 list의 경로를 하나하나 확인하면서 해당 경로에 import하고자 하는 package가 위치해 있는지 확인함.
정리
- 위에 import search순서에서도 언급하였지만 다시 한번 정리를 해보자면.
- 파이썬은 import하고자 하는 모듈과 package를 찾을때에 먼저 sys.modules를 보고 없으면 파이썬 built-in 모듈들을 확인하고 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾음.
- sys.path 에서도 못찾으면 ModuleNotFoundError 에러를 리턴함.
- 파이썬에 포함되어 있는 내장 모듈이고 파이썬 설치시 기본적으로 내장 모듈에 대한 path정보가 default 값으로 지정되어있다.
- Sys 모듈도 python에 내장된 built-in 모듈중 하나이므로 경로 검색순서에 따라 쉽게 찾을 수 있다.
Absolute path는 최상단 디렉토리를 기준으로 path 설정.
Absolute path는 최상위루트부터 경로를 표시해야해서 경로를 길게 표시해야하는 단점이 있다.
Relative path는 실행파일이 위치한 디렉토리를 기준으로 path를 설정.
Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고, 파일의 위치가 변경되면 경로 위치도 변경되어야 한다는 단점이 있다.
그러므로 웬만한 경우에는 absolute path를 사용하는게 권장된다.
동작을 시키니 이렇게 나온다.
그래서 공식문서 <-클릭) 를 확인해보니
이렇다고 한다. 그냥 막 번역기를 쓰다 보니 구문이 어설픈데
- 절대 가져오기는 대략 Absolute path(절대경로)를 말하는 것과
상대 가져오기,상대적 가져오기는 relative path(상대경로) 대략 이것인 걸로 보인다.- 마지막 줄에 기본 모듈로 사용하려는 모듈은 항상 절대 가져오기를 사용해라고 적혀있다.Absolute path(절대경로) 이것을 말하는 듯.
그래서 기존에 되어있던relative path 부분을 주석처리를 하고
이렇게 absoulte path 부분을 살려 주었다.
그랬더니
결과값이 출력이 잘 되는 걸 볼 수 있다.
상대경로로 출력을 한 경우
절대경로로 출력을 한 경우
- 위에 공식문서를 봤듯이 상대경로는 현재 모듈의 이름을 기반으로 함.
- 기본 모듈의 이름은 always
"__main__"
이므로 python 응용 프로그램의 기본 모듈로 사용하려는 모듈은 항상 절대경로를 사용해야함.- main모듈을 기본 모듈로 사용하기 위해서는 상대경로를 사용해서는 프로그램을 돌릴 수 없다.
패키지를 읽을 때 어떤 처리를 수행해야 하거나 패키지 내부의 모듈들을 한꺼번에 가져오고 싶을 때가 있습니다. 그럴때는 패키지 폴더 내부에
__init__.py
파일을 만들어 사용합니다.
- 패키지를 읽어 들일 때
__init__.py
를 가장 먼저 실행합니다.- 패키지와 관련된 초기화 처리 등을 할 수 있습니다.
__init__.py
에서는__all__
이라는 이름의 리스트를 만드는데 이 리스트에 지정한 모듈들이 form<패키지이름>import 를 할 때 전부 읽어 들여집니다.- 파이썬 3.3 이전 버전에서는
__init__.py
파일이 무조건 있어야 패키지로 작동했지만, 이후 버전에서는__init__.py
파일이 없어도 폴더 내부에 파이썬 파일이 들어 있기만 하면 패키지로 작동합니다.