if __name__ == “__main__”

 

 

이전 글 보러 가기

 

01_시작

02_기본설정

03_pykiwoom vs. 직접코딩

04_키움 open api 로그인 하기

05_키움 OPEN API에 TR 요청하기(feat. 예수금과 계좌잔고 받아오기)

06_키움 KOA 설치하기

07_키움 KOA 이해하기

08_키움 KOA 이해하기_2

09_키움 OPEN API 계좌평가 잔고 가져오기

10_키움 OPEN API 일봉데이터 가져오기_1

11_키움 OPEN API 일봉데이터 가져오기_2

12_파이참에서 주피터노트북 열기

13_키움API 삼성전자 자동매매 개요

 

 

 

if __name__ == “__main__”

 

이 짧은 코드 한 줄이 나에게 많은 것을 깨우치게 해줬다. 깨달음은 다음 글에서 포스팅할 예정이다. 키움 주식 자동화 14번째 글은 많은 시간을 투자해서 알게 된 if __name__ == “__main__” 에 대한 글이다.

 

 

이 코드의 목적은 명확하다.

해당 모듈이 인터프리터에서 직접 실행된 경우에는 if절 아래의 내용을 실행하는 것이다.

 

 

이 짧은 문장을 이해하기 위해선 모듈을 실행시키는 방법에 대한 이해가 필요하다.

1. 실행시키고자 하는 모듈을 다른 모듈에서 import 해서 실행

2. 실행시키고자 하는 모듈을 인터프리터(interpreter)에서 직접 실행

 

 

주식 자동화 포스팅을 하면서 유튜브 프로그램 동산(이하 "프동")의 도움을 많이 받았다. 프동이 실습 모듈을 제작하고 실행하는 과정은 다음과 같았다.

 

1. __init__.py 에서 ui.py를 import

2. ui.py 에서 kiwoom.py를 import

 

__init__.py와 ui.py 모듈은 별다는 코드가 없었다. 키움 API를 사용하는 모든 내용은 kiwoom.py에 들어있었다. 이 상태에서 코드를 실행시킬 때 kiwoom.py 파일이 아닌 __init__.py 파일을 실행한다. 그럼 kiwoom.py 파일이 import(init ← ui ← kiwoom) 되어 실행된다. 이렇게 kiwoom.py 모듈이 다른 모듈에 의해 import 되어 실행되면, 오늘의 주제인 <<if __name__ == “__main__”>> 코드가 필요 없다.

 

### __init__.py
from ui.ui import *

class Main():
    def __init__(self):
        print("실행할 메인 class")

        Ui_class()

if __name__ == "__main__":
    Main()



### ui.py
from kiwoom.kiwoom import *
import sys
from PyQt5.QtWidgets import *

class Ui_class():
    def __init__(self):
        print("Ui_class 입니다.")
        self.app = QApplication(sys.argv)
        self.kiwoom = Kiwoom()
        self.app.exec()


### kiwoom.py
class Kiwoom(QAxWidget):
    def __init__(self):
        super().__init__()
        print("Kiwoom 클래스 입니다.")
    ...
	...
    ...

그러고 보니 인터프리터에서 직접 실행하는 init.py 모듈에도 마지막에 <<if __name__ == “__main__”>> 코드가 있었다....

 

 

 

모듈이 import 되지 않고 인터프리터(interpreter)에서 바로 실행한다는 것은, kiwoom.py 모듈을 단독으로 실행하는 것을 의미하며, 이럴 경우에는 <<if __name__ == “__main__”>> 코드가 필요하다.

 

 

 

그 이유는 다음과 같다.

 

__name__은 인터프리터(interpreter)가 실행 전에 만들어준 글로벌 변수이다.

모듈이 import 되어 실행되면 __name__ 변수에 현매 모듈 이름인 kiwoom이 할당된다.

하지만, 모듈을 인터프리터(interpreter)에서 직접 실행하면 __name__ 변수에 __main__이 할당된다.

 

그래서 if 절 다음에 나오는 코드들은 class 또는 def로 정의한 내용들이다.

 

 

 

도움받은 감사한 글

1. medium.com/@chullino/if-name-main-%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C-bc48cba7f720

2. dojang.io/mod/page/view.php?id=2448

 

 

 

2021.01.22. 코리.

 

+ Recent posts