모듈
파이썬 스크립트 파일을 다른 곳에서 호출할 때 그 파일을 모듈이라고도 합니다.
즉, 호출이 되어지는 파이썬 파일은 모듈이라고 합니다.
설명의 편의상 파이썬 파일을 모듈이라고 하겠습니다.
한 디렉토리 안에서 모듈을 호출 하는 것 외에
어떤 디렉토리에 있는 모듈을 외부에서 호출해올 때를 생각해 보겠습니다.
p_test.py
[ inner ]
i_test.py
inner 디렉토리 안의 i_test.py에 아래 함수를 작성
# inner/i_test.py
def inner_add(a,b):
print(a+b)
이제 p_test.py에서 inner/i_test.py의 inner_add 함수를 몇가지 방식으로 호출해서 실행해봅시다.
1) from [디렉토리] import [모듈]
from inner import i_test
i_test.inner_add(1,2)
# output: 3
2) from [디렉토리].[모듈] import [함수]
from inner.i_test import inner_add
inner_add(1,2)
# output: 3
3) import [디렉토리].[모듈]
import inner.i_test
inner.i_test.inner_add(1,2)
# output: 3
4) import [디렉토리]
import inner
inner.i_test.inner_add(1,3)
# output: AttributeError: module 'inner' has no attribute 'i_test'
1), 2), 3)을 보면 최종적으로 호출되어 지는게 '모듈'이거나 '함수'이면 정상작동하고
4)를 보면 '디렉토리'가 최종적으로 호출되면 에러가 발생했습니다.
에러 메시지를 보면 'inner'를 module 'inner'라 칭하고 있고, 'inner'모듈 안에 i_test 가 없다고 하고 있습니다.
inner는 모듈이 아니고 디렉토리인데 파이썬은 모듈로 인식을 하고 스크립트를 실행했기 때문에 에러가 발생했습니다.
애초에 디렉토리를 불러올 수 있는 것이 아니기 때문입니다.
디렉토리를 바로 불러와서 사용할 수 있도록 하려면
해당 디렉토리 안에 __init__.py를 만들고 그 안에서 디렉토리 안에 있는 모듈들을 호출해와야 합니다.
예시 1) 모듈 호출
# inner/__init__.py
from . import i_test
# p_test.py
import inner
inner.i_test.inner_add(1,2)
# output: 3
__init__.py에 i_test 모듈을 import 해줌으로써
p_test.py에서 inner 디렉토리 자체를 모듈처럼 import
예시 2) 모듈에서 함수 호출
# inner/__init__.py
from .i_test import inner_add
# p_test.py
from inner import inner_add
inner_add(1,2)
# output: 3
__init__.py에 i_tesst.py 모듈에서 바로 inner_add 함수를 import 해줌으로써
p_test.py에서 inner에서 바로 inner_add 함수를 import
예시1), 예시2) 에서와 같이 __init__.py를 디렉토리 안에 만들고 그 안에서 호출할 모듈들을 정리해서 import 하면
해당 디렉토리를 모듈처럼 import 할수 있게 됩니다.
예시 3)
# inner/__init__.py
from .i_test import inner_add
# p_test.py
import inner
inner.inner_add(1,2)
inner.i_test.inner_add(1,2)
예시 3)의 마지막 코드는 실행이 될까? __init__.py에 import 한것은 inner_add이지 i_test가 아닌데 동작할까요?
동작합니다.
참고) from .모듈 vs from 모듈
# inner/__init__.py
from .i_test import inner_add
vs
from i_test import inner_add
__init__.py에서 i_test안의 inner_add 함수를 호출 할 때, from .i_test 이냐 . 없는 i_test 로 했는지의 차이인데요.
__init__.py 자체를 실행할 때는 . 없이 아래로 했을 때가 작동하고
__init__.py를 호출해서 외부에서 실행(p_test.py을 실행)할 때는 .을 붙인 위의 경우로 실행해야 에러가 없이 작동합니다.
외부에서 호출해서 사용하게 될 스크립트는 같은 디렉토리의 모듈에서 불러올 때, ".모듈"의 형태로 불러와야 합니다.
'Python' 카테고리의 다른 글
Python: insert() # insert argument in list (0) | 2023.01.23 |
---|---|
Python: json.loads() # string to dict # doble quotes # Boolean (2) | 2023.01.22 |
sum() in Python (0) | 2023.01.11 |
zip # python 여러 list, set 등을 묶어서 for loop 돌기 (0) | 2023.01.08 |
중복을 없애며 list 합치기 # set에 list 합치기 (0) | 2022.12.31 |