import modules and packages

minch·2021년 7월 8일
0

Python

목록 보기
7/13
post-thumbnail

먼저 계산을 할 수 있는 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 내에 직접 접근하여 실행 가능하게 만들수 있다.

Absolute path and relative path

python에서 import할 때, built_in module과 pip를 통해 설치한 module은 크게 문제 없이 불러오기가 잘 된다.

하지만, 직접 개발한 local package는 다르다.
directory를 해당 위치에 맞게 선언을 해야 오류가 발생하지 않는다.

선언하는 방법에는 abosolute pathrelative path가 존재한다.

absolute path

해당 module 및 package가 위치하는 directory를 import의 시작점으로 하고 생략하지 않기 때문에 어느 위치에서나 똑같은 경로로 사용 가능하다.

relative path

경로가 길어지는 불편함을 해결하기 위해, 현재 자기 자신이 속한 directory에서 출발하여 간략하게 나타낼 수 있다.

Precautions

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)

0개의 댓글