본문 바로가기

Python

__init__.py # import # from .

728x90
반응형

모듈

파이썬 스크립트 파일을 다른 곳에서 호출할 때 그 파일을 모듈이라고도 합니다.

즉, 호출이 되어지는 파이썬 파일은 모듈이라고 합니다.

 

설명의 편의상 파이썬 파일을 모듈이라고 하겠습니다.

 

한 디렉토리 안에서 모듈을 호출 하는 것 외에

어떤 디렉토리에 있는 모듈을 외부에서 호출해올 때를 생각해 보겠습니다.

 

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을 실행)할 때는 .을 붙인 위의 경우로 실행해야 에러가 없이 작동합니다.

 

외부에서 호출해서 사용하게 될 스크립트는 같은 디렉토리의 모듈에서 불러올 때, ".모듈"의 형태로 불러와야 합니다.

 

 

 

 

728x90
반응형