본문 바로가기

하루에 하나 배우기/Python

[2020-08-28-Python] if __name__ == "__main__"

 


  if __name__ ==  "__main__"  의 의미

 

1. __name__ 변수는 현재 파일이 어떻게 실행됐는지를 알려준다

 

이번에 웹 크롤링의 병렬 처리를 위해서 multiprocessing을 import 하면서 생겼던 일이다.

 

import Pool from multiprocessing

'''
생략
'''

with Pool() as pool	# 프로세스 개수 최대로 사용
	tagsList = list(pool.imap(CL_tags_from_post, row[4])) #row[4] = postList

 

다음과 같은 코드를 실행하려는데, (CL_tags_from_post는 웹 크롤링 함수이다.) 자꾸 파이썬 코드가 처음부터 다시 실행되는(그것도 프로세스 개수만큼) 이상한 현상이 발생했다.

 

구글링을 통해 알아낸 문제의 원인은 코드의 맨 앞에 if __name__ == "__main__" 을 붙이지 않은 것이었다. 따라서 다음과 같이 해 주었더니 잘 실행되었다.

 

import Pool from multiprocessing

if __name__ == "__main__"
	
    '''
    생략
    '''
	
    with Pool() as pool:
    	tagsList = list(pool.imap(CL_tags_from_post, row[4])) #row[4] = postList

이유를 알고 싶어 찾아 본 결과

 

__name__ 이라는 변수는 현재 파이썬 파일이 어떻게 사용되고 있는지(다른 py파일로부터 import 된 것인지, 직접 인터프리터에서 실행된 것인지)에 대한 내용을 담고 있었다.

 

2. import 된 경우와 interpreter에서 실행된 경우에 따른 __name__ 변수의 값은 다르다

 

예를 들어 아래 처럼 한 줄짜리 testfile1.py 파일을 직접 인터프리터에서 실행시키면

 

print('testfile1의 현재 실행 상태는 ' + str(__name__) + '입니다.' )

 

출력 결과는 다음과 같다.

 

C:\Users\01079\anaconda3\python.exe C:/Users/01079/PycharmProjects/testProject/venv/insta_Crawller/testfile1.py
testfile1의 현재 실행 상태는 __main__입니다.

Process finished with exit code 0

 

하지만 py 파일은 다른 py 파일에서 import 될 때 기본적으로 한 번 실행이 되는데, 이 때 __name__의 값은 __main__이 아니라 파일명이 된다.

 

testfile2.py 에서 testfile1.py를 import하고 testfile2.py를 실행시켜보면,

 

import testfile1

print('testfile2의 현재 실행 상태는 ' + str(__name__) + '입니다.' )

 

testfile1.py는 import 되었기 때문에 한 번 실행되었을 것이고, 그 다음에 testfile2.py의 상태를 출력하는 구문이 온다.

 

따라서 출력 결과는 다음과 같다.

 

C:\Users\01079\anaconda3\python.exe C:/Users/01079/PycharmProjects/testProject/venv/insta_Crawller/testfile2.py
testfile1의 현재 실행 상태는 testfile1입니다.
testfile2의 현재 실행 상태는 __main__입니다.

Process finished with exit code 0

testfile1.py는 import 되었기 때문에 __name__ 이 파일명인 'testfile1' 라는 값을 가지고, testfile2은 직접 인터프리터에서 실행되었기 때문에 __name__ 이 '__main__' 이라는 값을 가진다.

 

 

3. Pool() 함수 내부적으로 함수가 쓰인 파일을 import 하거나 여러번 반복 실행하는 구문을 가지고 있는 듯 하다.

 

그렇기 때문에 if __name__ == '__main__' 구문이 없을 때 내 메인 함수가 여러번 실행되었을 것이다.