All Articles

Python - package 실습

로컬 환경에서 파이썬을 설치하고 진행해 주세요. 디렉토리 구조는 다음과 같고 각 파일의 코드내용은 다음과 같습니다. __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