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__' 구문이 없을 때 내 메인 함수가 여러번 실행되었을 것이다.
'하루에 하나 배우기 > Python' 카테고리의 다른 글
[2020-09-01-Python] plotly를 이용한 Bubble chart, 시계열 데이터까지 (0) | 2020.09.01 |
---|---|
[2020-08-30-Python] Pandas pandas.concat() 함수 (0) | 2020.08.30 |