먼저 계산을 할 수 있는 calculator package
를 만들어보았다.
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)
directory
├── main.py
└── calculator
├── __init__.py
├── add_and_multiply.py
└── multiplication.py
__init__.py
__init__.py
는 해당 directory가 package임을 알려주는 역할을 한다.
python 3.3
이상 부터는 없어도 상관없지만, 하위 버전과의 호환성을 위해 넣어주는것이 좋다.)그리고, 해당 package 내에 있는 특정 module의 모든 데이터를 불러와주는 역할도 가능하다.
game/
├── __init__.py
└── sound/
├── __init__.py
└── echo.py
예를 들어,
game.sound
에 접근해서 echo
module을 불러오고 싶을때
>>> from game.sound import * >>> echo.echo_test() Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'echo' is not defined
echo
가 정의되지 않아 error가 발생한다.
이를 해결하기 위해,
__init__.py
__all__ = ['echo']
__init__
에 __all__
변수를 설정하여 해당하는 module을 할당하면
해당 module 내에 직접 접근하여 실행 가능하게 만들수 있다.
python에서 import
할 때, built_in
module과 pip
를 통해 설치한 module은 크게 문제 없이 불러오기가 잘 된다.
하지만, 직접 개발한 local package는 다르다.
directory를 해당 위치에 맞게 선언을 해야 오류가 발생하지 않는다.
선언하는 방법에는 abosolute path와 relative path가 존재한다.
해당 module 및 package가 위치하는 directory를 import의 시작점으로 하고 생략하지 않기 때문에 어느 위치에서나 똑같은 경로로 사용 가능하다.
경로가 길어지는 불편함을 해결하기 위해, 현재 자기 자신이 속한 directory에서 출발하여 간략하게 나타낼 수 있다.
python에서 모듈 자체를 실행하는 경우에는 그 모듈안에 다른 모듈을 import할 때 반드시 절대 경로로 import해야한다.
(아래 사이트 참고)
python 공식 문서
즉, 직접 실행되는 모든 script 파일 안에서는 absolute path를 사용하여야 한다.
다시 말해서 실행 되지 않는 module에서만 relative path를 사용할 수 있다는 것이다.
예를 들어,
├── main.py
└── calculator
├── __init__.py
├── add_and_multiply.py
└── multiplication.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))
absolute path는 정상적으로 잘 작동하는 반면,
relative path로 불러오면 아래와 같이 error가 발생한다.
그리고,
직접 실행되지 않는 하위 패키지 속 add_and_multiply.py
는
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)
두 방법 모두 정상적으로 작동하는 것을 확인할 수 있다.
참조
(https://docs.python.org/3/tutorial/modules.html)
(https://wikidocs.net/1418#9595init9595py)