[Python]Package 생성

박현희·2020년 9월 21일
0

이전 포스팅에 이어서

🤨개념 정리 & 문제 풀이

4. calculator 패키지 만들기

앞으로 개발하면서 많은 패키지를 사용할 것이고 만들어야 하는 경우도 있을 수 있기 때문에 이번과제는 직접 패키지를 만들어 보는 과제 입니다.
로컬 환경에서 파이썬을 설치하고 진행해 주세요.
디렉토리 구조는 다음과 같고 각 파일의 코드내용은 다음과 같습니다.
init.py 파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.

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)

Desktop 폴더 안에 caculator와 main.py를 만든 모습


main.py 안에 상대경로로 import를 하니

경로에서 가져올 수 없다는 오류가 생겼습니다.

그 이유는 상대경로로 import 시 현재 module의 이름을 기반으로하기 때문입니다.
만약 모듈을 해당 모듈이 작성된 스크립트 안에서 실행한다면 항상 name == "main" 입니다. 그러나 다른 모듈에서 import 할 경우에는 "main" 이 아닌 모듈명이 출력됩니다.

main 모듈의 이름은 항상 "main"이기 때문에, 파이썬 어플리케이션은 항상 절대경로를 사용해야 합니다.

위 문구처럼 calculator 파일구조에서 main은 package에 속한 파일이 아닙니다. 그렇기 때문에 main.py가 속한 module은 'main'이 되는 것입니다.
결국 절대경로로 calculator package를 바라 봐줘야 합니다.


따라서 다음과 같이
상대경로를 절대경로로 변경하니 오류가 사라졌습니다.

6. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.

main module인 add_and_multiply.py 에서 multiplication 모듈의 함수를 import 하기 위해 절대경로로 지정하였습니다.
절대경로로 지정했음에도 불구하고, 상위 패키지명인 calculator를 찾지 못하는 에러가 발생했습니다.
그 이유는 절대경로는 바로 current directory에서 시작하기 때문입니다.
절대경로라고 해서 무조건 최상위 디렉토리에서 시작하지는 않습니다. 해당 스크립트가 속한 경로 중에서 default로 지정되는 current directory 를 파악해보고 경로를 설정하는게 좋습니다.

import os

print(os.path.dirname(__file__))  # 현재 스크립트가 속한 디렉토리까지의 경로
print(os.listdir(os.path.curdir))  # current directory list
print(os.listdir(os.path.pardir))  # parent directory list

#/Users/hyunheepark/Desktop/calculator
#['.DS_Store', 'hyoniii', 'calculator', 'main.py']
#['.DS_Store', 'Desktop']

결과를 보면 add_and_multiply.py 가 속한 디렉토리는 calculator 이며, 상위 디렉토리는 "Desktop"이다. 즉, 절대경로의 시작점은 calculator 이므로, 경로에서 제외해야 한다. 따라서 다음과 같이 수정할 수 있다.

7. init.py 파일의 역할에 대해서도 정리해서 블로깅 해주세요.

이 파일이 존재하는 디렉터리는 패키지의 일부임을 알려주는 역할입니다. 따라서 init.py라는 파일이 없는 디렉터리는 패키지로 인식되지 않습니다.
특히 all 변수를 통해서 import 가능한 모듈/함수/변수 등을 지정할 수 있습니다. all에 포함되지 않는 것은 접근할 수 없습니다.

0개의 댓글