패키지 만들어보기

1. 직접 밑에 사진과 같은 디렉토리 구조와 파일의 코드내용를 가지는 패키지를 만들어 보자!


◼ 시도

📄 디렉토리 구조

💻 main.py

# 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)

❓❗에러

Traceback (most recent call last):
  File "C:\Users\최대환\PycharmProjects\pythonProject\venv\main.py", line 6, in <module>
    from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
  • 에러 메시지를 해석해보면 알려지지 않는 부모 패키지에 상대경로 임포트 시도를 했다고 뜬다.
  • 상대경로는 현재 모듈의 이름에 기반한다. 메인 모듈의 이름은 언제나 "main"이기 때문에 파이썬에서 메인 모듈로 사용하려고 하는 모듈들은 반드시 필수로 절대경로 임포트를 사용해야 합니다.
    참고자료

◼ 수정

💻 main.py

# absoulte path
from calculator.add_and_multiply import add_and_multiply


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

👀 결과

5

2. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로 임포트 해보기!

절대경로

💻 add_and_multiply.py

from calculator.multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

print(add_and_multiply(1,2))

👀 결과

5

상대경로

💻 add_and_multiply.py

from .multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

print(add_and_multiply(1,2))

👀 결과

ImportError: attempted relative import with no known parent package

알수 있는 점

  • 절대 경로로 임포트 했을때는 결과물이 잘 출력 되었지만 상대 경로로 시도 했을 때는 오류가 발생했다.
  • 파이참에서는 run을 누르면 그 파일이 자동으로 메인 모듈로 설정되어서 상대경로는 그 파일을 실행시킬 수 없다.

main 모듈과 차이점은?

  • 물론 파이참에서는 메인 모듈이 자동으로 바뀌어서 상대경로를 사용을 못했지만, 다른 파이썬 실행 프로그램에서는 메인 모듈이 아닌 모듈과 다른 모듈을 상대경로로 연결하여 사용할 수있다.

__init__.py 파일의 역할은?

  • __init__.py 파일이 있으면 package가 import 될때 __init__.py 파일의 코드들이 자동으로 실행한다.
  • __init__.py 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.
  • Import 할때 경로의 총 길이 줄여줄 수 있다.

👉 예시

📄 디렉토리 구조(test파일 생성)

💻 __init__.py

from .test import hello

💻 test.py

def hello():
    print("hello")

💻 main.py

from calculator.add_and_multiply import add_and_multiply

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

from calculator import hello
hello()

👀 결과

5
hello
  • Package에서 import 할 수 있는 변수/함수/클래스 제한한다.
    💻 __init__.py
from .test import hello
from .add_and_multiply import add_and_multiply
from .multiplication import multiply

__all__ = ['hello']  #hello함수만 허용해준다.

💻 main.py

from calculator import *

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

👀 결과

NameError: name 'add_and_multiply' is not defined
hello
  • 그 외 package가 import될때 꼭 먼저 실행되어야 하는 코드들을 써준다.

좋은 웹페이지 즐겨찾기