질문
제목: if __name__ == "__main__"은 무엇을 하는 것인가요?
이것은 무엇을 하는 것이며, if
문을 포함해야 하는 이유는 무엇인가요?
if __name__ == "__main__":
print("Hello, World!")
이 관용구를 사용해야 하는데 사용하지 않는 경우 질문을 닫으려는 경우, 대신 Why is Python running my module when I import it, and how do I stop it?을(를) 중복으로 닫으십시오. 함수를 호출하지 않은 경우나 잘못된 기대로 인해 main
이라는 함수가 자동으로 시작점으로 사용되는 것으로 예상하는 경우, Why doesn't the main() function run when I start a Python script? Where does the script start running?을(를) 사용하십시오.
답변
짧은 답변
보일러플레이트 코드는 사용자가 의도하지 않은 상황에서 스크립트를 실수로 호출하는 것을 방지하는 코드입니다. 보호 기능이 생략된 스크립트에서 발생하는 일반적인 문제 몇 가지를 살펴보겠습니다:
보호 기능이 없는 스크립트를 다른 스크립트에서 가져온 경우(예:
import my_script_without_a_name_eq_main_guard
), 후자의 스크립트는 전자를 가져와 가져오는 시간과 두 번째 스크립트의 명령줄 인수를 사용하여 실행합니다. 이것은 거의 항상 잘못된 일입니다.보호 기능이 없는 스크립트에 사용자 정의 클래스가 있고, 이를 pickle 파일에 저장한 다음 다른 스크립트에서 unpickle하는 경우, 이전 항목에서 설명한 문제가 발생합니다.
긴 답변
이것이 왜 중요하며 이것이 Python 스크립트를 초기화하는 방법과 모듈 가져오기 메커니즘과 상호작용하는 방법을 이해하기 위해 Python이 스크립트를 초기화할 때 두 가지 작업을 수행합니다.
Python 인터프리터가 소스 파일을 읽을 때 먼저 두 가지 특수 변수를 정의합니다. 이 경우, 우리는 __name__
변수를 신경 써야합니다.
모듈이 주 프로그램인 경우
모듈(소스 파일)을 주 프로그램으로 실행하는 경우, 예:
python foo.py
인터프리터는 __name__
변수에 하드코딩된 문자열 "__main__"
을 할당합니다.
# 주 프로그램으로 실행될 때 모듈 상단에 인터프리터가 삽입하는 내용입니다.
__name__ = "__main__"
다른 모듈에 의해 가져와지는 경우
반면에, 다른 모듈이 주 프로그램이며 그 모듈이 당신의 모듈을 가져온 경우, 이는 주 프로그램에 다음과 같은 문이 있음을 의미합니다.
# 이것이 다른 주 프로그램에 있는 경우입니다.
import foo
인터프리터는 당신의 foo.py
파일을 찾아보고(ex. 몇 가지 변형을 검색), 그 모듈을 실행하기 전에 import 문에서 "foo"
이름을 __name__
변수에 할당합니다.
# 다른 모듈에서 가져올 때 모듈 상단에 인터프리터가 삽입하는 내용입니다.
__name__ = "foo"
모듈 코드 실행
특수 변수가 설정된 후, 인터프리터는 모듈의 모든 코드를 한 번에 한 문장씩 실행합니다. 이 설명을 따라가기 위해 코드 샘플이 있는 다른 창을 열어두는 것이 좋습니다.
항상
문자열
"before import"
를 출력합니다(따옴표 없음).math
모듈을 로드하고math
라는 변수에 할당합니다. 이는 다음과 같이import math
를 대체하는 것과 동일합니다(__import__
는 실제 가져오기를 트리거하는 Python의 저수준 함수입니다).
# 모듈 이름 "math"을 이용하여 모듈을 찾아 로드하고,
# 로컬 변수인 math에 할당합니다.
math = __import__("math")
문자열
"before function_a"
를 출력합니다.def
블록을 실행하여 함수 객체를 만들고, 그 함수 객체를function_a
라는 변수에 할당합니다.문자열
"before function_b"
를 출력합니다.두 번째
def
블록을 실행하여 다른 함수 객체를 만들고, 그것을function_b
라는 변수에 할당합니다.문자열
"before __name__ guard"
를 출력합니다.
모듈이 주 프로그램인 경우에만
- 당신의 모듈이 주 프로그램이라면,
__name__
이 실제로"__main__"
으로 설정되었음을 확인하고 두 함수를 호출하여 문자열"Function A"
와"Function B 10.0"
을 출력합니다.
다른 모듈에 의해 가져와지는 경우에만
- (대신) 당신의 모듈이 주 프로그램이 아니지만 다른 모듈에서 가져온 경우,
__name__
은"foo"
가 되고,if
문의 본문을 건너뛰게 됩니다.
항상
- 두 상황 모두에서 문자열
"after __name__ guard"
를 출력합니다.
요약
'Python > Python FAQ' 카테고리의 다른 글
Python 프로그램을 실행하거나 시스템 명령을 호출하는 방법은 무엇인가요?, How do I execute a program or call a system command? (0) | 2023.05.04 |
---|---|
Python 예외 없이 파일이 존재하는지 확인하는 방법은 무엇인가요?, How do I check whether a file exists without exceptions? (0) | 2023.05.04 |
Python 파이썬 교집합, 합집합, 차집합 찾는 방법 (0) | 2022.01.10 |
Python 파이썬 문자열 슬라이싱, string 나누기, 자르기 (0) | 2022.01.06 |
Python 파이썬 str 사이에 str 넣기, 문자 삽입 (0) | 2021.12.25 |
댓글