파이썬 완전 자동화(프로그램 자동화)! - pywinauto 사용하기
본문 바로가기
기타 저장소/유용한 tool

파이썬 완전 자동화(프로그램 자동화)! - pywinauto 사용하기

by _HEBB 2020. 2. 24.

pywinauto

파이썬으로 작업을 자동화하는 pywinauto 로 자동화에 입문하자

 

윈도우즈 자동화가 뭘까

이전의 포스트에서 입력장치 자동화를 해주는 pyautogui 에 대해서 알아보았다. 그러면 윈도우즈 프로그램 자동화가 대체 뭘까? 프로그램 자동화란 어떤 프로그램을 자동으로 조작할 수 있게 한다는 말이라고 이해하면 충분하다. 예를 들어서, 게임이라는 프로그램을 생각하면, 게임을 시작하고 게임 안에서 스킬을 사용하고 채팅을 치는 등의 모든 행위를 자동으로 할 수 있게 도와주는 것이다. 어떻게 이런것이 가능할까? 사용자 프로그램은 대부분 GUI 를 통해 프로그램 흐름을 제어한다. 즉 마우스와 키보드의 이벤트 를 받아 처리하는 것이다. 프로그램은 이 이벤트를 처리하는 부분이 있는데, 버튼, 입력창, 스크롤바 등이 이에 해당하고, 각각 접근할 수 있는 ID 라는 것이 있다. 바로 이 ID 를 추적해서 이벤트를 강제로 발생시키는 것이 가능하다. pywinauto 는 실행중인 프로그램에서 모든 GUI 요소를 추출해 파이썬 언어로 제어할 수 있게하는 툴이다.

 

이런 툴을 이용하면 입력장치 자동화와 차원이 다른 자동화를 수행할 수 있다. 입력장치에 대한 입력을 아예 받을 수 없는 환경이거나 제한적일 경우, 프로그램 레벨에서 제어를 할 수 있는것이 프로그램 자동화이다. 프로그램 자체를 제어하는 것이 아닌 프로그램과 사용자를 이어주는 GUI 를 제어 한다. 숨어있어서 누를 수 없는 버튼이 있다하더라도, 그 버튼을 찾아서 클릭할 수 있다.

 

단 pywinauto 라는 이름에서 알 수 있듯이 파이썬 라이브러리이고 오직 윈도우즈 프로그램만을 제어할 수 있다. 맥이나 리눅스 프로그램 자동화에 대한 정보는 찾기가 힘들다.
+ 리눅스 프로그램도 일부 지원한다고 한다. 하지만 윈도우즈에 최적화되어있다.

 

설치하는 방법

pip 가 설치되어 있다면 간단하게 설치할 수 있다.
pip insatll pywinauto

 

간단히 사용해보기

먼저 간단요약하면

  1. 앱 실행 / 앱 연결
  2. 앱 다이얼로그 접근
  3. 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 와 함께 자동화된 세상을 만들어보자!

>> pywinauto 매뉴얼

 

Contents — pywinauto 0.6.8 documentation

© Copyright 2018, Mark Mc Mahon and Contributors Revision aea0429b.

pywinauto.readthedocs.io

>>2020/02/27 - [기타 저장소/유용한 tool] - 파이썬 자동화 툴 - pyautogui 사용하기

 

파이썬 자동화 툴 - pyautogui 사용하기

pyautogui 마우스와 키보드를 자동으로 움직여보자 자동화가 뭐지? 자동화는 말그대로 사람 개입없이 자동으로 무언가를 하는것이다. 기존에 사람이 수동으로 직접하던것이 뭐가 있는지 생각해보자. 가장 대표적..

diplabs.tistory.com

 

댓글