패키지 만들어보기
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될때 꼭 먼저 실행되어야 하는 코드들을 써준다.
Author And Source
이 문제에 관하여(패키지 만들어보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gigymi2005/패키지-만들어보기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)