import 준비 -> sys.modules -> built-in 모듈 확인 -> sys.path
Q) 파이썬이 모듈과 패키지를 찾는 방법으로 sys모듈을 사용한다.
그런데 sys 또한 모듈인데 파이썬이 어떻게 찾을까?
- built-in 모듈
만일 module5.py 에 function2 함수를 불러온다고 한다면
from package2.subpackage1.module5 import function2
Q) my_app 을 적지 않는 이유는 무엇일까?
my_app/package2/subpackage1/module5.py
파이썬에서 from import 키워드를 사용하게 되면, 이미 my_app프로젝트에서 출발하기 때문에, my_app은 적지 않는다.
정리
- my_app 프로젝트 내에서는 어느 파일, 어느위에서 import 하던지 경로가 항상 위와 같기 때문에 absolute path 라고 한다.
절대경로와의 가장 큰 차이점은 "기준" 이다.
절대경로 처럼, 최상단 디렉토리를 기준으로 경로를 잡는 것이 아닌,
import하는 위치를 기준으로 경로를 정의한다.
package2의 module3 에서 package2의 subpackage1의 module5의 function2 함수를 import 한다면,
from .subpackage1.module5 import function2
main.py
add_and_multiply.py
multiplication.py
패키지 구성
오류의 내용을 확인해 보면,
ImportError : 부모 패키지에 없는 import를 가지고 왔다.
수정코드)
결과)
add_and_multiply.py의 경우 calculator 패키지의 모듈중 하나이다.
main.py는 add_and_multiply.py모듈을 받아 실행시키는 파일이다.
- add_and_multiply.py 절대 경로 실행
결과: 실행가능- add_and_multiply.py 상대 경로 실행
결과: 오류
- add_and_muliply.py 가 절대경로 일때, main.py의 실행 여부
결과: multiplication 모듈을 찾을 수 없다고 한다.- add_and_multiply.py가 상대경로 일때, main.py의 실행여부
결과: 실행
결론)
- 절대경로의 경우 최상위 부터 읽어야 하기 때문에, multiplication만 적으면 실행이 되지 않는다. 상위인 caculator 부터 읽어와야지 정상 작동 된다.
- 절대경로를 사용할 경우 직관적으로 패키지와 모듈을 더 쉽게 이해하고 수정할 수 있다.
init.py : 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.
python 3.3 버전부터는 init.py 파일이 없어도 패키지로 인식된다.
하지만 하위 버전 호환을 위해 init.py 파일을 생성하는 것이 안전한 방법이다.