티스토리 뷰

반응형

윈도우 자동화 툴 - pywinauto
파이썬을 처음 접하면서 우연찮게 알게된 pywinauto. 인터넷 강의 자동 수강 프로그램을 만들어 보느라 알게 되었는데,윈도우의 GUI에 접근하여 마우스,키보드 작업을 자동화할 수 있는 라이브러리이다. 임의의 창을 특정하거나, (없으면 실행하는 것도 가능하다) 창의 모듈을 특정하여 키 입력이나 마우스 입력을 전달하여 사용자가 미리 정의한대로 작업을 자동화하는 것이 가능하다.

이번 글에서는 pywinauto를 설치하고 간단히 사용하는 방법에 대해 알아보도록 하겠다.

0. pywinauto 설치를 위해

pywinauto를 설치하기 위해서는 먼저 SendKeys라는 모듈을 설치해야 한다. SendKeys는 키보드 입력을 가상으로 만들어주는 모듈이다. >> SendKeys 다운로드

SendKeys를 사용하는 방법은 다음 기회에 조금 더 자세히 다루도록 한다. 참고로 pywinauto에는 특정 창 혹은 창 내부의 특정 영역을 이미지로 캡쳐하는 기능도 있는데, 이 기능들을 100% 활용하기 위해서는 Python Image Library를 설치해 두어야 한다.

pywinauto의 설치 파일은 이곳에서 다운로드 받을 수 있다.

1. pywinauto 설치하기
다운로드 받은 압축파일을 풀면 pywinauto-x.x.x 라는 폴더가 생성된다. 해당 폴더 내의 setup.py 파일을 install 파라미터와 함께 실행하면 된다. 예를 들어 C:\ 아래에 pywinauto-x.x.x 폴더가 있다면 명령창에서 다음과 같이 입력한다.

C:> CD pywinauto-x.x.x
C:\pywinauto-x.x.x> python setup.py install

설치 과정에 대한 로그가 주르륵 표시되고, 설치가 완료된다. 물론 이를 설치하기 전에 위에서 언급한 SendKeys 모듈도 미리 설치되어 있어야 겠다.

2. pywinauto 사용하기

pywinauto를 사용하여 어플리케이션을 제어하기 위한 1차적인 수단은 application 모듈을 반입하는 것이다. 그 중 Application 클래스를 사용하게 된다. 

from pywinauto import application 혹은
from pywinauto.application import Application

어플리케이션은 1)창을 참조하거나 2)프로그램을 시작하는 형태로 연결하여 사용이 가능하다.  
프로그램을 시작하는 예는 다음과 같다.

from pywinauto.application import Application
app = Application.start("notepad.exe")
app.Notepad.SetFocus()
app.Notepad.TypeKeys('''abcdefghijklmn{ENTER}opqrstuvwxyz''')

위 코드는 IDLE에서 한 줄씩 입력해서 보는 것이 좀 더 재미있을 듯 하다. 예제 코드는 메모장을 실행하여 abcdefghijklmn 을 타이핑하고 줄을 바꾸어서 나머지 알파벳들을 주르륵 입력한다. 조금 느린 컴퓨터라면 좌르르륵 글자들이 늘어서는 광경을 바라볼 수도 있을 것이다.

이런 형태로 특정한 프로그램을 시작하여 제어하는 방법이 있는가하면, 현재 열려있는 윈도우들을 제목표시줄의 텍스트를 기반으로 검색하여 선택하는 방법도 있다. 즉

from pywinauto.application import Application 
app = Application()
iffview = app.window_(title_re=".*IrfanView")
irfview.DrawOutline()

위의 코드를 순서대로 한 줄씩 실행하면 IrfanView 의 창이 띄워진 상태에서, 해당 창에 연두색 테두리가 그려진다. 이렇게 테두리를 그리는 방법을 통해 수동을 각각의 창을 찾아 나갈 수 있다. 그리고 title_re 값을 통해 정규식을 기반으로  창을 찾아 나갈 수 있다. 창을 참조하는 방법은 이렇게 제목 표시줄의 텍스트를 통해 참조할 수 있으며, 위의 메모장 예제와 같이 start 하거나 connect 하는 경우에는 일반적인 GUI 모듈 이름을 참조하여 사용할 수 있다.

보다 자세한 내용은 pywinauto 홈페이지의 Getting Started 항목이나, 새로이 추가된 것으로 보이는 pywinauto 동영상을 참고하는 편이 좋을 듯 하다. 잠깐 시간을 투자하면 꽤나 많은 것을 알게 될 것으로 생각된다.

3. 한글이 들어간 메뉴, 창 참조하기

pywinauto를 처음 사용하면서 절대 안되던 것이 있었는데, 바로 창의 제목에 한글이 들어가는 경우였다. 위의 예제에서 notepad.exe를 실행하면 메모장이 실행되는데, 그 때는 start를 사용했었고, 콤포넌트 이름이 Notepad를 쓸 수 있어서 사용이 가능했다. 그런데 pywinauto 홈페이지에서는 '메뉴'도 참조하여 열어보이고 있는데, 한글 윈도를 사용하면 당연히 메모장의 메뉴도 한글로 표기되어 참조하기가 만만치 않다. 혹은 이미 열려진 윈도우를 참조해야하는 경우에도 한글로 창을 검색하려면 왠지 잘 되지 않는데, 이 해결 방안을 살펴보도록 하자.

먼저, 윈도는 내부적으로 유니코드는 아닌 듯 하지만, GUI 단계에서는 유니코드를 사용하고 있는 것으로 보인다. 따라서 편집기를 사용하는 경우 다음과 같이 입력한다.

#-*-coding:utf-8
from pywinauto.application import Application 
app = Application()
iffview = app.window_(title_re=u".*간지쟁이.*")
irfview.DrawOutline()

이렇게 파일을 저장하고 실행하면, 지금 블로그를 열어놓은 창을 찾아서 연두색 테두리를 그려준다. 즉 인코딩을 명시하고 유니코드 문자열로 한글을 입력해주면 된다. (그리고 IDLE 설정도 UTF-8을 사용하도록 해 두긴 하였다.) 그런데 문제는 대화형 IDLE 상에서는 유니코드인 양 u'xxxx'를 사용해도 절대 찾지 못한다. 이는 IDLE에서는 한글을 euc-kr을 사용하기 때문인 것으로 보이는데. 즉 위와 같은 코드를 IDLE에서 한 줄 한 줄 입력하여 알아내고 싶다면, 

irfview = app.window_(title_re='.*간지쟁이.*'.decode('euc-kr')) 로 입력하면
irfview.DrawOutline() 을 실행했을 때 예외가 발생하지 않고 정상적으로 처리되는 것을 알 수 있다.

별도의 클래스를 정의해 놓으면 상당히 편리하게 한글 단어가 들어간 창을 선택하는 툴을 만들 수 있을 듯 하다. 하지만 pywinauto의 주 기능이 '자동화 작업'이라고 생각한다면, 애초에 특정 프로그램을 start하여 제어하는 것이 좀 더 편할 수 도 있다는 생각이 든다. 이 번 포스팅에서 조금 아껴둔 내용들을 나중에 다시 정리하여 올릴 것을 약속하며, 가뭄에 콩나듯 올리는 포스팅을 이쯤에서 마무리하고자 한다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함