[Python] 모듈/패키지 - 연습

김상웅·2022년 5월 30일
0

[파이썬]

목록 보기
8/17

앞서 포스팅했던 파이썬의 모듈과 패키지에 대해 연습해보겠습니다.

✅ 패키지 만들기


1. calulator 패키지 만들기

  • calculator 디렉토리를 만들어줍니다.
  • 해당 디렉토리는 다음 3개의 파일을 갖고 있습니다.
    __init__.py add_and_multiply.py multiplication.py

2. 모듈 작성하기

main.py

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)

✅ 실행결과


1. 결과

calculator 모듈을 불러온 main.py를 실행하면 다음과 같은 에러가 발생합니다.

2. 해결방법

해결 방법 중 하나로 절대경로를 명시해주는 방벙이 있습니다.

파이썬의 공식 문서에는 다음과 같이 설명하고 있습니다.

 Note that relative imports are based on the name of the current module.
 Since the name of the main module is always "__main__",
modules intended for use as the main module of a Python application must always use absolute imports.

즉, 실행된 main.py__main__으로 모듈 이름이 변경이 됩니다.

상대경로로 작성할 때는 main.py를 기준으로 해당 파일의 경로를 탐색합니다.

하지만 __main__으로 이름이 변경되어 실행되면서 기준이 되는 파일을 찾을 수 없다는 것입니다.

따라서 위 main.py 모듈에서 import하는 모듈의 경로를 다음과 같이 절대 경로로 수정하여 주겠습니다.

from calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))

3. 수정 후 실행 결과

결과는 다음과 같습니다.


[참고자료]
https://docs.python.org/3/tutorial/modules.html#intra-package-references

✅ 기본모듈과 이외 모듈의 차이점


1. 기본모듈 외의 모듈의 경로

실행되는 기본 모듈은 __name____main__으로 변경된다는 점을 위에서 언급했습니다.

그렇다면 기본 모듈이 아닌 B모듈에서 C모듈을 import 할 때에도 절대경로를 사용해야 할까요?

코드를 통해 알아보겠습니다.

모듈 import 경로 수정

우선 절대경로로 multiply 모듈을 import 해보겠습니다.

__add_and_multiply.py__

from calculator.multiplication import multiply
# from calculator.multiplication import multiply

def add_and_multiply(a,b):
	print(f"모듈 name: {__name__}")
    return multiply(a,b) + (a+b)

결과는 다음과 같습니다:

이번에는 상대경로로 multiply 모듈을 import 해보겠습니다.

__add_and_multiply.py__

from .multiplication import multiply
# from calculator.multiplication import multiply

def add_and_multiply(a,b):
	print(f"모듈 name: {__name__}")
    return multiply(a,b) + (a+b)

결과는 역시 다음과 같습니다.

2. 기본 모듈과의 차이점

실행되는 모듈의 이름은 __main__ 이었습니다.

그 외 모듈은 어떤 이름을 갖고 있을까요?

print(f"module Name: {__name__}")

위 코드를 통해 알아본 결과 __add_and_multiply.py__name은 다음과 같습니다.

이를 통해 기본 모듈이 아닌 이상 절대경로나 상대경로를 사용하여도 무방하다는 사실을 알게되었습니다.

실행되는 기본 모듈 : import 시 절대경로 사용
그 외 모듈: 절대/상대경로 사용

profile
누구나 이해할 수 있도록

0개의 댓글