sys.modules는 dictionary 형태
sys.path는 list 형태
파이썬에서 경로를 찾는 순서 1. sys.modules 2.built-in modules 3. sys.path
이미 한번 import된 모듈과 package들을 저장하고 있다.
다음에 사용할 때 다시 찾지 않아도 된다.
string 요소들을 가지고 있는 list / 각 string요소들은 경로를 나타냄
파이썬 파일 => 모듈 , 파이썬 파일을 담고 있는 디렉토리 => package
전에 import했던 정보들을 저장해놓는 sys.modu.les를 확인 과정을 거침
파이썬에서 제공하는 공식 라이브러리들(built-in modules)에서 확인 과정 거침
마지막으로 각 경로들을 포함하고 있는 sys.path(list)에서 하나 하나 확인 과정을 거침
absolute path는 모듈 및 패키지의 시작부터 끝까지 생략,축약되지 않고 명확히 명시된 경로를 뜻함(가장 최상위 디렉토리에서 시작)
from package2.subpackage1.module5 import function
relative path는 import하는 위치를 기준으로 경로 정의
주로 local package 안에서 다른 local package를 import할 때 사용
from . import class1 (같은 위치에서 import할 때 현재위치 . 하고 import class1)
from .subpackage1. module5 import function2(하위의 것을 import할때 절대와 비슷하게)
from ..module4 import class4 (상위의 것을 import할 때)
처음에는 calculator폴더에 main과 다른모듈들을 같이 넣어서 오류가 계속 났었다.
그래서 calculator_ver1 폴더에 calculator폴더와 main.py를 넣고 나머지 모듈들은 calculator폴더에 넣고 실행이 잘 되었다.
ImportError: attempted relative import with no known parent package
상위패키지를 못 찾아서 발생하는 에러다.
main은 항상 절대경로를 이용해야한다.
절대경로와 상대경로와 상관없이 잘 실행이 된다.
main은 절대경로만 가능하고 상대경로는 오류가 뜬다.
해당 디렉토리가 패키지의 일부임을 알려주는 역할
python3.3부터는 init.py가 없어도 패키지로 인식하지만 하위호환을 위해 생성하는게 좋다.
from calculator import * 을 사용했을 시 오류가 뜬다.
init.py에서 all = ['add_and_multiply']를 생성하고
add_and_multiply(모듈명).add_and_multiply(1,2)(사용할 메서스명)