파이썬에서 모듈과 패키지를 찾는 순서
1. sys.modules
2. built-in modules
3. sys.path
Q: sys.modules 와 sys.path의 차이점
A: sys.modules는 이미 import된 모듈과 package들을 저장하는 딕셔너리이고 그러므로 새로 import하는 것은 포함되지 않음
sys.path는 경로가 포함된 리스트이며 로컬환경에서 프린트 해보면 파이썬이 설치된 경로가 나옴
Q: sys 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?
A: sys는 built-in modules 중 하나이므로 한번 import 하면 sys.modules에 포함됨
Q: Absolute path와 relative path의 차이점을 서술해 주세요.
A: 절대경로는 최상단 디렉토리를 기준으로 하는 경로
상대경로는 현재 위치(import하는 위치)를 기준으로 하는 경로
main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러
Traceback (most recent call last): File "c:\Users\resto\Documents\wecode\module_practice\main.py", line 5, in <module> from .calculator.add_and_multiply import add_and_multiply ImportError: attempted relative import with no known parent package
메인모듈의 이름은 항상 __main__
이 되기 때문에 상대경로를 이용하면 경로를 찾지못하여 에러가 발생한다.
해결방법
add_and_multiply.py에서 multiply함수를 절대경로와 상대경로로 각각 임포트 하고나서 main.py를 실행할때 상대경로로 하면 오류가 없고 절대경로를 쓰면 오류발생함
add_and_multiply.py를 실행하는 경우 절대경로로 import 해야 오류가 없다 왜냐면 add_and_multiply.py를 메인모듈로 인식했기 때문에 절대경로를 사용해야한다
__init__.py
의 용도:
파이썬이 디렉터리를 패키지로 취급하게 만들기 위해서 __init__.py
파일이 필요하다
파이썬3.3 버전부터는 __init__.py
파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 파이썬 버전의 호환성을 위해 __init__.py
파일을 생성하는 것이 안전하다.