CYBOS Plus 설치 튜토리얼
환경
- OS: Windows
- IDE: VS code
가이드
윈도에서 CYBOS Plus를 설치하고 파이썬으로 연결상태를 확인하는 튜토리얼이다. 파이썬의 객체지향성이나 IDE를 다루는 부분에서는 어느정도 익숙한 사용자라고 가정하겠다.
Step 1. CYBOS Plus 설치
대신증권 다운로드 센터에서 CYBOS Plus를 다운로드 받자.
사실 따로 받을 수 있는 건 아니고, CYBOS 프로그램 안에 Plus가 내장된 형태라 CYBOS를 받긴 해야한다. 마법사의 지시에 따라 설치를 진행하면 된다. 설치가 끝나고 나면 Visual C++ 2008 Setup이 진행된다. 이 단계에서는 조금 오래 기다릴 뿐 별로 어려운 게 없다.
재부팅 할거냐고 물어보면 순순히 재부팅하도록 하자.
Step 2. CYBOS Plus 연결 확인
다음은 CYBOS Plus가 연결되었는지 확인해주는 파이썬 코드로, win32com.client
의 Dispatch()
모듈이 CYBOS를 사용할 수 있는 객체인 instCpCybos
를 가져와준다. 연결된 경우 마지막에 IsConnect
프로퍼티가 1로 출력된다. 만약 win32com.client
가 존재하지 않을 경우 pip install pywin32
로 설치하면 된다.
import win32com.client
instCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
print(instCpCybos.IsConnect)
물론 저대로 실행하면 당연히 다음과 같은 에러가 난다. CYBOS Plus를 설치만 했을 뿐 실행하지 않았기 때문이다.
>>> instCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
Traceback (most recent call last):
File "C:\Users\rmsms\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\dynamic.py", line 81, in _GetGoodDispatch
IDispatch = pythoncom.connect(IDispatch)
pywintypes.com_error: (-2147221005, '잘못된 클래스 문자열입니다.', None, None)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\rmsms\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "C:\Users\rmsms\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\dynamic.py", line 98, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:\Users\rmsms\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\dynamic.py", line 83, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2147221005, '잘못된 클래스 문자열입니다.', None, None)
이 외에도 에러가 일어났다면 그 이유는 다음 네가지 중 하나일 가능성이 높다:
Dispatch("CpUtil.CpCybos")
에 들어간 문자열에 오타가 있다.- CYBOS Plus를 실행하지 않았다.
- IDE 혹은 터미널을 관리자권한으로 실행하지 않았다.
- 파이썬이 32-bit가 아니다.
역으로 위 조건 중 하나라도 만족시키지 못하면 에러가 날 가능성이 높다.
Step 3. CYBOS Plus 실행
CYBOS를 실행하고 위 스크린샷과 같이 정확히 CYBOS Plus 탭을 선택한 후 로그인한다. 잠시 기다리면 다음과 같이 CYBOS Plus 공지사항을 보여주는 창이 뜬다.
트레이에서 CYBOS Plus Start라는 프로그램이 실행되고 있는지 확인할 수 있다.
이 상태에서 다시 연결여부를 확인해보면 아까와는 다르지만 여전히 에러가 뜬다.
>>> instCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
Traceback (most recent call last):
File "C:\Users\rmsms\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\dynamic.py", line 81, in _GetGoodDispatch
IDispatch = pythoncom.connect(IDispatch)
pywintypes.com_error: (-2147221021, '작업을 사용할 수 없습니다.', None, None)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\rmsms\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "C:\Users\rmsms\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\dynamic.py", line 98, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:\Users\rmsms\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\dynamic.py", line 83, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2147221164, '클래스가 등록되지 않았습니다.', None, None)
Step 4. Python 32-bit 설치
꼭 파이썬이 아니라도 CYBOS Plus는 32-bit로 개발되었기 때문에 사용하고 있는 환경이 어떻게 되든 CYBOS Plust를 불러올 응용 프로그램은 32-bit여야한다.
파이썬 다운로드 페이지에서 32-bit 인스톨러를 찾아 다운로드한다. 만약 본인이 기존에 쓰던 파이썬 64-bit와 같이 쓰기 싫다면 이 기회에 아나콘다 32-bit를 설치해보는 것도 나쁘지 않다. 거꾸로 conda를 쓰던 사람은 그냥 pip를 써보는 것도 괜찮다.
버전 컨트롤이라는게 별로 간편하지도 않거니와 CYBOS Plus 외에 32-bit를 굳이 쓸 필요가 없는 개발자라면 반대 버전을 설치하는 게 훨씬 편할 것이다. 어쨌든 여기선 굳이 아나콘다를 설치하지 않고 pip로 버전을 관리해보겠다. 통으로 아나콘다를 설치하는 게 가장 간단한데, 그래도 튜토리얼이니만큼 제일 어려운 길로 돌아가보는 것이다.
다음은 Python 3.7.2 64-bit를 사용하던 컴퓨터에서 굳이 Python 3.9.6 32-bit를 설치한 후, 거기서 win32com을 사용할 수 있도록 패키지를 설치한 명령어다.
C:\Users\rmsms\AppData\Local\Programs\Python\Python39-32\python.exe -m pip install pywin32
이제 연결 상태를 확인해보면 다음과 같이 에러는 일으키지 않지만 연결이 되지 않아 0이 출력되는 것을 확인할 수 있다.
Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:04:37) [MSC v.1929 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32com.client
>>> instCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
>>> print(instCpCybos.IsConnect)
0
Step 5. IDE 혹은 터미널 관리자 권한으로 실행
관리자 권한으로 IDE를 실행시키고 다시 연결을 확인해보면 다음과 같이 1이 출력되는 것을 확인할 수 있다.
Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:04:37) [MSC v.1929 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32com.client
>>> instCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
>>> print(instCpCybos.IsConnect)
1
연결은 됐다는데 실제로 정보를 받아오는지 어떤지 알 수가 없으니 종목명으로 종목코드가 불러지는지를 확인해보자. 예를 들어 ‘씨젠’이면 다음과 같이 A096530을 잘 받아온다.
>>> instCpStockCode = win32com.client.Distpatch("CpUtil.CpStockCode")
>>> seegene = instCpStockCode.NameToCode("씨젠"); seegene
'A096530'
이러한 API의 응용 프로그램은 CYBOS Plus가 실행된 상태에서만 사용할 수 있다.