현재 파일에 정의된 main 함수 호출

머신러닝 코드를 분석하다 보니
잘 모르고 있던 파이썬 문법을 보게 된다.
머신러닝이 느는 것 같지는 않지만, 파이썬이라도 건져서 다행이다.

sys 모듈에 modules라는 속성이 있는데..
현재 로딩되어 있는 모듈을 딕셔너리 형태로 갖고 있다.
먼저 간단하게 출력을 하는 코드이다.

import sys

print(type(sys.modules))

for k, v in sys.modules.items():
print('{}\n **{}'.format(k, v))

# [출력 결과]
# <class 'dict'>
# zipimport
# **<module 'zipimport' (built-in)>
# apport_python_hook
# **<module 'apport_python_hook' from '/usr/lib/python3/dist-packages/apport_python_hook.py'>
#
# 중략...
#
# encodings
# **<module 'encodings' from '/usr/lib/python3.5/encodings/__init__.py'>
# _collections
# **<module '_collections' (built-in)>


다음 코드는 sys.modules에 포함된 값을 사용해서
현재 파일에 정의된 main 함수를 호출한다.
main과 sub 함수를 정의하지 않았다면, 호출 시점에서 에러가 발생한다.

# t_4.py
import sys

def main(_):
print('hello, main...')

def sub():
print('goodbye, sub...')

print(sys.modules[__name__])
print(sys.modules[__name__].main)
sys.modules[__name__].main(None)

print(sys.modules['__main__'])
print(sys.modules['__main__'].sub)
sys.modules['__main__'].sub()

# [출력 결과]
# <module '__main__' from '/home/python-kim/바탕화면/ml/t_4.py'>
# <function main at 0x7f868790df28>
# hello, main...
# <module '__main__' from '/home/python-kim/바탕화면/ml/t_4.py'>
# <function sub at 0x7f8687903048>
# goodbye, sub...

현재 파일의 이름은 t_4.py이고,
파일이 하나뿐이므로 __name__ 변수에는 '__main__' 문자열이 들어가 있다.
다시 말해 __name__으로 호출하나 '__main__'으로 호출하나 차이가 없다.
modules에 포함된 현재 파일을 사용해서 함수를 호출하는 코드일 뿐이다.


조금 어려워지는데..
다음 코드는 t_4.py 파일을 포함하고 있는 새로운 파일이다.
여기서 t_4.py 파일의 내용을 가져오기 때문에
t_4.py 파일에서 __name__은 '__main__'이 되는 것이 아니라
파일의 실제 이름인 't_4.py'가 된다.
이 말은 sys.modules[__name__].main은 정상적으로 동작하지만
sys.modules['__main__'].sub는 에러가 발생한다는 뜻이다.

# t_6.py
import t_4

print('end of t_6')

# [출력 결과]
# <module 't_4' from '/home/python-kim/바탕화면/ml/t_4.py'>
# <function main at 0x7f11b784f048>
# hello, main...
# <module '__main__' from '/home/python-kim/바탕화면/ml/t_6.py'>
# Traceback (most recent call last):
# File "/home/python-kim/바탕화면/ml/t_6.py", line 1, in <module>
# import t_4
# File "/home/python-kim/바탕화면/ml/t_4.py", line 22, in <module>
# print(sys.modules['__main__'].sub)
# AttributeError: module '__main__' has no attribute 'sub'

'파이썬' 카테고리의 다른 글

IP 주소를 위도와 경도로 변환  (0) 2017.06.25
import 정리  (0) 2017.05.01
줄 바꿈 없이 계속 출력  (0) 2017.04.19
numba - 성능 업!  (0) 2017.04.18
pprint : 쉽고 예쁘게 출력하기  (0) 2017.04.09