[Python] 모듈에서 __init__.py 외에 __main__.py 의 사용 Develop Tip

일반적으로 파이썬 패키지라 하면,

~/submod
~/submod/__init__.py

라고 하여 빈 __init__.py 만 만들면 해당 path 에 해당하는 패키지를 접속할 수 있습니다.

예를 들어, mytest.py 가 submod 안에 있고

~/submod
~/submod/__init__.py
~/submod/mytest.py


#!/usr/bin/env python
# encoding=utf-8
################################################################################
def myprint(msg):
    print "[__init__]:%s" % msg
################################################################################
def mytest():
    myprint('mytest')
    return True
################################################################################
if __name__ == '__main__':
    r = mytest()
    assert(r)

라는 내용을 담고 있다면,

~에서는

$ python -m submod.mytest
[__init__]:mytest

라고 실행 및 해당 결과가 나옵니다.

해당 모듈을 실행시킬 때
__name__ 이 '__main__'으로 실행되기 때문이지요.


그런데 만약 mytest 에 있는 myprint 및 mytest 라는 함수가 필요에 따라
__init__.py 에 있다고 가정하고 ​mytest.py 의 내용을 
__init__.py 에 그대로 넣어두고 동일한 개념으로

~에서

$ python -m submod

를 실행시켰으나

원하는 결과 ​"[__init__]:mytest" 가 나오지 않았습니다.

생각해보니 __name__이 __main__ 이 아닐까 싶어...

~/submod/__main__.py 라는 파일을 만들어

!/usr/bin/env python
# encoding=utf-8
from . import mytest
################################################################################
if __name__ == '__main__':
    r = mytest()
    assert(r)

라고 __main__ 으로써 호출하는 것만 넣어 두었습니다.

이렇게 하고 나서 다시 ​

$ python -m submod
[__init__]:mytest

라고 원하는 결과가 나왔습니다.

개인적으로는 이와 같은 경우가 어떨 때 필요하냐면

~/A 와 같은 단일 모듈이 아니라

~/A/B/C
~/A/B/D
~/A/B/E/F
~/A/B/E/G

와 같이 깊은 Depth의 모듈 호출이 있는데 
A, A.B, A.B.E 와 같은 그 중간 모듈에서
어떤 함수 또는 클래스를 정의하고 사용할 때
위와 같이 __init__.py 및 __main__.py 를 이용하면
별도 python 파일을 사용하지 않고 간단하게
그 중간 모듈의 함수, 클래스를 이용할 수 있습니다.


어느분께는 도움이 되셨기를...



덧글

댓글 입력 영역

구글애드텍스트