sys.modules
를 사용해 확인하면 sys는 'sys': <module 'sys' (built-in)> 즉, 빌트인 모듈로 이미 내장되어 있어 built-in modules에 저장되어 있다.
일반적으로 모듈을 import할 때는 상대경로로도 가능하다. 하지만 패키지 내에서 main 모듈은 항상 이름이 "__main__"이고, 상대경로는 현재 모듈의 이름을 기반으로 하고 있기 때문에 main 모듈로 사용하려는 모듈에 한해서는 반드시 절대경로를 사용해야 한다. 그렇지 않으면 ImportError: attempted relative import with no known parent package에러를 발생시킨다. 출처
보충) 모듈의 name은 표준입력, 스크립트, interactive prompt에서 읽어올 때는 '__main__'으로 세팅된다. 그렇기 때문에 main.py에서 상대경로로 import하게 되면 실행중인 main.py의 이름도 main이기 때문에 인터프리터는 어떤 것을 불러와야 하는지 모르게 되므로 에러가 뜬다.
main 모듈에서는 상대경로로 import 할 경우 에러가 발생한다. 하지만 그 외의 모듈에서는 절대경로와 상대경로를 모두 사용할 수 있는데, 아래와 같이 문제 없이 동작한다.
절대경로로 설정했을 때
상대경로로 설정했을 때
패키지를 import할 때, 전술했듯 파이썬은 sys.path 를 탐색하며 패키지의 하위 디렉터리를 찾는다. 이 때 __init__.py는 이 파일을 포함하고 있는 디렉터리를 패키지로 취급할 수 있도록 만든다. init파일은 빈 파일이어도 상관 없으나, 초기화 코드를 실행시킬 수도 있다.