main.py에서 add_and_mutiply를 상대경로로 임포트 했을 때 아래와 같은 에러가 발생한다.
(ImportError: attempted relative import with no known parent package)
에러가 발생하는 이유는 파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대경로로 임포트를 사용해야 한다.
절대경로로 임포트할 경우 문제없이 임포트가 가능했다.
(1) 절대경로와 상대경로 모두 실행이 되지 않고 오류가 발생한다. 절대경로는 패키지를 인식하지 못하고 상대경로는 알려진 부모패키지가 없이 상대경로 import를 실행한다는 오류가 출력된다.
(2) main 모듈과의 차이점은 name 변수를 확인하는 조건문이 있어서 main 모듈을 실행할 때는 name 변수의 조건문이 이를 만족시켜 print 함수를 실행시킨다. add_and_multiply.py 모듈은 절대경로와 상대경로 모두 정상적으로 작동이 가능하다.
(1) 'init.py' 파일은 해당 디렉터리가 패키지의 일부라는 것을 알려주는 역할을 한다.
그러나 python3.3 버전부터는 init.py 파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 버전 호환을 위해 init.py 파일을 생성하는 것이 안전한 방법이다.
(2) init.py에서 from .모듈 import 변수, 함수, 클래스 또는 from .모듈 import * 형식으로 작성했다면 패키지를 가져오는 스크립트에서는 패키지.함수() 형식으로 사용할 수 있다.
(3) 패키지의 init.py에서 from .모듈 import 로 모든 변수, 함수, 클래스를 가져오면 패키지 외부에 공개하고 싶지 않은 것까지 공개되는데 이때는 all에 공개할 모듈, 변수, 함수, 클래스를 리스트 형태로 지정해주면 된다. all이라는 이름 그대로 모든 것()을 공개할 때의 목록을 정하는 것이다.