본문 바로가기

Programming/파이썬 빠르게 배우기

main이 어디 있나?

반응형
print("Hello")

이렇게 하면,

바로 Hello 가 출력됩니다.

 

파이썬에서는, main 필요 없습니다. 그냥 하고픈 명령을 쓰면 차례대로 그냥 실행됩니다.

 

즉, 위 코드가 들어 있는 hello.py라는 파일을,

python hello.py

 

이렇게 커맨드 창에 입력하면 그냥 됩니다.

 

Java나 C 프로그래밍에 익숙한 사람들이 파이썬 접하면서 가장 먼저 낯설게 느껴지는 것이 main 없이 코드가 진행되는 것일 겁니다. Java/C는 프로그램의 시작점이 main에서 시작되기에, 코드를 볼 때 일단 main부터 찾는 게 습관화되어 있습니다.

 


 

프로그램 시작점에 대해서 좀 더 알아둘 게 있습니다.

 

코드 파일 3개를 만들어서, 몇 가지 테스트를 해보겠습니다.

#controller.py
print("I'm Controller")
#a.py
print("I'm A")
#b.py
print("I'm B")

 

이걸 각각 실행하면,

 

>python controller.py
I'm Controller

>python a.py
I'm A

>python b.py
I'm B

 

뭐 이렇게 결과가 나오는 건 당연합니다.

 

근데, 여기서 각각 controller.py a.py b.py의 __name은 '__main__' 입니다.

 

이게 무슨 말?

 

python.exe에 의해서 직접 호출되어 수행되는 스크립트 파일이, 내부적으로는 __name='__main__' 으로 할당되어 관리된다는 겁니다. 그럼, python.exe가 아닌 다른 것에 의해서도 호출될 수 있다는 건가요?

 

네. 당연.

 

controller.py가 a.py를 호출할 수 있습니다.

#controller.py
import a

print("I'm Controller")

python controller.py
I'm A
I'm Controller

import a를 하게 되면 'a.py' 파일을 호출하게 되는 겁니다.

 

이때 호출되는 각 파일들의 __name__은,

controller.py's __name__ = __main__
a.py's __name__ = a

 

정리하면,

 

  • python.exr에 의해 직접 호출되는 스크립트 파일의 이름만 __main__
  • 스크립트 파일이 다른 스크립트 파일에의해 호출되면, 파일명이 이름으로 됨

 

다른 스크립트파일에 의해 호출되는 것을 모듈로서 사용된다고 합니다.

 


 

main 함수가 따로 없지만, python.exe에 의해 직접 호명되는 스크립트 파일의 __name__ 값이 __main__ 이라는 것을 이용해서, C나 Java의 main() 함수스러운 기법을 쓸 수 있습니다.

 

다음과 같은 프로그램을 만들어 봅시다.

 

  • a.py는 I'm A를 출력하는 함수 do_print()를 갖습니다.
    그리고, a.py가 python.exe에 의해 직접 호출될 때는 이 do_print() 함수를 호출합니다.
  • b.py도 마찬가지로 I'm B를 출력하는 do_print() 함수를 갖습니다.
    그리고 b.py가 직접 호출될 때 do_print() 함수 호출합니다.
  • controller.py는 a.py와 b.py를 import 하고, do_print() 함수에서 a.do_print()와 b.do_print()를 호출합니다.

 

#a.py
def do_print():
    print("I'm A")

if __name__ == '__main__':
    print("This is called from a.py:")
    do_print()
#b.py
def do_print():
    print("I'm B")

if __name__ == '__main__':
    print("This is called from b.py:")
    do_print()
#controller.py
import a, b

def do_print():
    a.do_print()
    b.do_print()

if __name__ == '__main__':
    do_print()

 

실행해보면,

 

>python a.py
This is called from a.py:
I'm A

>python b.py
This is called from b.py:
I'm B

>python controller.py
I'm A
I'm B

 

해석을 해보면,

 

python a.py라고 실행되면, a.py의 __name__ 속성 값이 __main__이기에 아래 코드가 실행될 겁니다.

if __name__ == '__main__':
    print("This is called from a.py:")
    do_print()

왜 이런 코드가 필요한가 하면, a.py 파일에서 do_print()라는 함수를 만들었는데 이 함수가 제대로 동작하는지 테스트를 해봐야잖아요. 해서 각 파일에서 자체 테스트가 필요한 거지요. 이 do_print()가 다른 스크립트 파일에서 호출되는 것을 목적으로 만들었어도.

 

마찬가지로 b.py도 같은 로직으로 되어 있습니다.

 

이제 controller.py를 보면, 이것을 python.exe에서 직접 호출하면,

  • import a, b에 의해 a.py와 b.py 모듈이 호출됨
    그런데, a.py나 b.py에는 함수가 있고, 실행 스크립트로는 if __name__ == '__main__': 만 있는데,
    python.exe에 의한 호출이 아니기에 이 if 로직이 실행되지 않아서,
    결국 아무것도 실행되지는 않고, 단지 a.pyb.py에 있는 함수들을 사용할 수 있는 준비만 된 상태
  • controller.py가 python.exe에 의해 직접 호출된 것이기에 if __name__ == '__main__': 구문을 통과해서,
    do_print()가 호출되고, do_print() 함수 내에서 a.do_print()와 b.do_print()가 호출되게 됨

 


 

이제 파이썬에서의 시작점에 대해서 감이 잡혔을 겁니다.


다시 정리해 보면,

 

  • 파이썬의 스크립트 파일은, python.exe에 의해서 건 다른 스크립트 파일에 의해서건 호출되었을 때는,
    스크립트 명령어들이 순서대로 쭈욱 실행됨
    (def로 정의되는 함수는, 정의되어 있다고 호출되는 것은 아니고, 어디선가 호출되어야 실행되는 것임)

  • python.exe에 의해서 직접 호출된 스크립트 파일과 다른 스크립트 파일에 의해 모듈로서 호출되는 것을 구분하려면,
    if __name__ == '__main__': 구문을 사용하면 됨

-끝-

반응형

'Programming > 파이썬 빠르게 배우기' 카테고리의 다른 글

블록기호 없음. 들여쓰기가 중요  (0) 2020.05.11
for 구문이 좀 이상한데?  (0) 2020.05.10
if~else 있고, switch 없다.  (0) 2020.05.10
변수 선언 없다.  (0) 2020.05.10
이 글목록에 대해  (0) 2020.05.10