pywinauto
파이썬으로 작업을 자동화하는 pywinauto 로 자동화에 입문하자
윈도우즈 자동화가 뭘까
이전의 포스트에서 입력장치 자동화를 해주는 pyautogui
에 대해서 알아보았다. 그러면 윈도우즈 프로그램 자동화가 대체 뭘까? 프로그램 자동화란 어떤 프로그램을 자동으로 조작할 수 있게 한다는 말이라고 이해하면 충분하다. 예를 들어서, 게임이라는 프로그램을 생각하면, 게임을 시작하고 게임 안에서 스킬을 사용하고 채팅을 치는 등의 모든 행위를 자동으로 할 수 있게 도와주는 것이다. 어떻게 이런것이 가능할까? 사용자 프로그램은 대부분 GUI 를 통해 프로그램 흐름을 제어한다. 즉 마우스와 키보드의 이벤트 를 받아 처리하는 것이다. 프로그램은 이 이벤트를 처리하는 부분이 있는데, 버튼, 입력창, 스크롤바 등이 이에 해당하고, 각각 접근할 수 있는 ID 라는 것이 있다. 바로 이 ID 를 추적해서 이벤트를 강제로 발생시키는 것이 가능하다. pywinauto 는 실행중인 프로그램에서 모든 GUI 요소를 추출해 파이썬 언어로 제어할 수 있게하는 툴이다.
이런 툴을 이용하면 입력장치 자동화와 차원이 다른 자동화를 수행할 수 있다. 입력장치에 대한 입력을 아예 받을 수 없는 환경이거나 제한적일 경우, 프로그램 레벨에서 제어를 할 수 있는것이 프로그램 자동화이다. 프로그램 자체를 제어하는 것이 아닌 프로그램과 사용자를 이어주는 GUI 를 제어 한다. 숨어있어서 누를 수 없는 버튼이 있다하더라도, 그 버튼을 찾아서 클릭할 수 있다.
단 pywinauto 라는 이름에서 알 수 있듯이 파이썬 라이브러리이고 오직 윈도우즈 프로그램만을 제어할 수 있다. 맥이나 리눅스 프로그램 자동화에 대한 정보는 찾기가 힘들다.
+ 리눅스 프로그램도 일부 지원한다고 한다. 하지만 윈도우즈에 최적화되어있다.
설치하는 방법
pip 가 설치되어 있다면 간단하게 설치할 수 있다.pip insatll pywinauto
간단히 사용해보기
먼저 간단요약하면
- 앱 실행 / 앱 연결
- 앱 다이얼로그 접근
- UI 제어
순으로 할 수 있다. 가장 단순한 메모장 프로그램으로 예제를 돌려보겠다.
프로그램 제어를 위해 가장 먼저 할 일은 어플리케이션 즉 프로그램을 찾는 것이다. 파이썬 변수에 앱에 해당하는 객체를 연결해야 한다. 앱에 대한 접근은 이 객체로부터 시작한다. 실행중인 프로그램을 connect
할 수도 있고, 앱을 지정하여 start
할 수도 있다.
from pywinauto import application
app = application.Application()
app.start('Notepad.exe')
#app.start('notepad')
위 코드를 실행하면 메모장이 켜진다. 이는 앱을 지정하고 직접 실행시킨 경우다. 함수 내부에서 문자열 처리를 하는 로직이 있어서 이름을 비슷하게만 써도 가끔 실행이 된다.
app = application.Application().connect(process=6768)
위처럼 하면 이미 실행되고 있는 PID(Process ID)
를 찾아서 연결한다. PID 는 작업관리자를 눌러서 확인할 수 있다. start 와 동일하게 app
변수로 앱에 접근할 수 있다. 윈도우 핸들러를 이용해서 연결할 수도 있는데 어쨌든 접근하기만하면 된다.
dialog = app.window()
#dialog = app.UntitledNotepad
#dialog = app['UntitledNotepad']
앱에 접근했으면 다이얼로그에 접근해야 한다. 위 코드는 다이얼로그를 얻어낸다. window
에 접근하는 것이 핵심이다. 이 다이얼로그도 문자열 처리가 되어서 여러가지 방법으로 접근할 수 있다. 주석처리된 코드도 동일하게 작동한다. 프로그램마다 다이얼로그 이름이 다르고 여러개일 수 있으므로 알아내기 위해 조금 노력을 해야한다. 생각보다 pywinauto 라이브러리가 아주 유능하진 않다. 그래서 좀 더 검색을 해보니 spy++ 프로그램이라는 것을 알게 되었다. 이 프로그램은 윈도우 프로그램을 분석해주는 건데, 여기서 다이얼로그나 속성들의 이름을 알아낼 수 있다고 한다.
# 입력 테스트
dialog.Edit.type_keys('입력 테스트!!')
# 메뉴 선택해서 종료 테스트
dialog.menu_select('파일 -> 끝내기')
app['메모장'].저장안함.click()
어쨌든 다이얼로그를 획득하면 드디어 UI 아이템을 제어할 수 있다. 위 코드를 실행하면 메모장에 뭔가를 적고 종료를 하게 된다.
자주 쓰일만한 UI 제어 명령은 다음과 같다.
- menu_select('path') - 프로그램의 맨 위 메뉴 선택
- 버튼이름.click() - 버튼 클릭
- Edit.type_keys('str') - 입력창에 문자열 입력
이외에도 해당 프로그램 종료시키기 등이 있다. 무거운 프로그램일 경우, 딸려있는 작은 프로세스가 있는 경우가 있는데(공지사항 창 등) PID 나 창 이름을 이용해 얘만 종료시켜버릴수도 있다.
일상을 자동화하자!
지금까지 소개한 기능만으로 많은 일을 할 수 있다. 매크로를 만들고, 일정기간이나 일정량만큼 데이터를 쌓고 자동으로 파일을 업로드하는 등의 잡무를 대신해 줄 수 있다. 각 프로그램을 조금 뜯어보는 수고를 들여야하지만 그만큼의 값어치를 할 가능성이 높지 않을까? 게다가 spy++
툴도 조합하면 더 쉽게 다양한 작업이 가능할 수도 있다. 이전에 소개했던 pyautogui 와 함께 자동화된 세상을 만들어보자!
>>2020/02/27 - [기타 저장소/유용한 tool] - 파이썬 자동화 툴 - pyautogui 사용하기
'기타 저장소 > 유용한 tool' 카테고리의 다른 글
윈도우에서 리눅스 사용하기 - WSL (0) | 2020.03.03 |
---|---|
움짤, 짤 만드는 프로그램 - GifCam (0) | 2020.02.29 |
파이썬 자동화 툴 - pyautogui 사용하기 (3) | 2020.02.27 |
파이썬 시각화의 끝판왕 bokeh 사용하기 (2) | 2020.02.20 |
차세대 개발환경, jupyter lab 을 사용하자 (2) | 2020.02.19 |
댓글