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.py
와b.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 |