로컬 환경에서 파이썬을 설치하고 진행해 주세요.
디렉토리 구조는 다음과 같고 각 파일의 코드내용은 다음과 같습니다.
__init__.py
파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.
./calculator/add_and_multiply.py
./calculator/multiplication.py
./main.py
main.py
# absoulte path
#from calculator.add_and_multiply import add_and_multiply
# relative path
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
add_and_multiply.py
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
multiplication.py
def multiply(a,b):
return(a*b)
Q1. main.py
에서 상대경로로 add_and_mutiply
를 임포트 했을 때 발생하는 에러를 확인하고 main module에서는 패키지의 모듈을 어떻게 임포트 해야하는지 서술하세요.
A1.
Traceback (most recent call last):
File "main.py", line 5, in <module>
from ..calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
알 수 없는 부모 패키지로부터 import를 시도했을 때 뜨는 오류다.
파이썬에서 상대경로로 import할 때는 기준점을 잡기 위해 __name__
변수를 이용한다. __name__
변수는 모듈의 이름을 저장하고 있다. 따라서 main.py
파일에서 조건문 if __name__ == '__main__':
의 의미는 현재 모듈이 main module(=시작점)일 경우에 조건을 실행하라는 뜻이다.
-m 모듈이름
명령어는 해당 모듈을 sys.path
에서 검색하고 그것을 main module로 실행하라는 의미다. main
모듈이 있는 프로젝트 폴더 외부에서 main
모듈의 경로를 명시한 뒤 실행하면 에러 없이 결과값이 나온다.
프로젝트 폴더 이름을 cal-project
라고 하고 프로젝트 폴더의 상위 폴더 이름을 python-project
라고 하면,
# python-project 디렉토리에서 명령어 실행
python -m cal-project.main
# 결과값
5
가 출력된다.
한 단계 더 상위 폴더에서 실행해도 절대경로만 지정해주면 마찬가지로 실행할 수 있다.
# python-project 디렉토리의 상위 디렉토리인 python에서 명령어 실행
python -m python-project.cal-project.main
# 결과값
5
아니면 절대경로로 import하는 간편한^^! 방법도 있다. 역시 절대경로를 권장하는 이유가 있다.
# absoulte path
from calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
# 결과값
5
Q2. add_and_multiply.py
에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.
A2.
# 절대경로
from multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
print(add_and_multiply(2,3))
#결과값
11
# 상대경로
from .multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
Traceback (most recent call last):
File "add_and_multiply.py", line 5, in <module>
from .multiplication import multiply
ImportError: attempted relative import with no known parent package
상대경로로 import 시 main.py
에서 발생한 것과 같은 에러가 뜬다. 마찬가지로 main module인 add_and_multiply
모듈의 위치를 잡지 못해 발생하는 에러다.
따라서 add_and_multiply
모듈이 있는 폴더의 상위 폴더에서 -m
명령어로 실행해주면 된다. (경로: cal-project/calculator/add_and_multiply.py
)
# cal-project 폴더에서 명령어 실행
python -m calculator.add_and_multiply
#결과값
11