카테고리: 업무 자동화

파이썬 업무 자동화#9마우스·키보드 GUI 자동화! 클릭·타이핑을 파이썬이 대신하게 하기 (PyAutoGUI)

목차10개 항목

안녕하세요! Mojangcam입니다 😎

지난 #8편에서는 pypdf로 PDF 병합·분할·비밀번호 처리를 자동화해봤어요. 이번 편에서는 조금 다른 차원의 자동화를 다뤄볼게요. 바로 마우스와 키보드 자체를 파이썬이 조종하게 만드는 GUI 자동화입니다!

지금까지 배운 자동화(엑셀, 크롤링, Selenium 등)는 전부 "프로그램 내부"에서 데이터를 다루는 방식이었어요. 그런데 회사에서 쓰는 프로그램 중에는 API도 없고, 웹도 아니고, 오직 마우스로 클릭해야만 하는 옛날 프로그램이 정말 많죠. ERP, 사내 전용 프로그램, 오래된 업무 툴… 이런 건 PyAutoGUI로 해결할 수 있어요. 사람이 하는 클릭·타이핑을 그대로 흉내 내는 라이브러리거든요!

📌 준비물

  • Python 3.8 이상
  • PyAutoGUI 0.9.x (이 글은 0.9.54 기준)
  • pyperclip (한글 입력용 — 이유는 아래에서!)
터미널
pip install pyautogui==0.9.54 pyperclip

💡 윈도우는 위 명령이면 끝이에요. macOS는 pyobjc-core·pyobjc가, 리눅스는 python3-xlib이 추가로 필요할 수 있는데, pip이 대부분 알아서 설치해줍니다. macOS는 시스템 설정에서 손쉬운 사용(접근성) 권한을 터미널에 줘야 동작해요.

📌 1단계 - 마우스 제어하기

먼저 화면 좌표를 이해해야 해요. 화면 왼쪽 위가 (0, 0)이고 오른쪽 아래로 갈수록 숫자가 커집니다.

Python
import pyautogui

# 화면 해상도 확인
print(pyautogui.size())        # 예: Size(width=1920, height=1080)

# 현재 마우스 위치 확인
print(pyautogui.position())    # 예: Point(x=512, y=300)

# 마우스 이동·클릭
pyautogui.moveTo(500, 300, duration=0.5)  # 0.5초에 걸쳐 이동
pyautogui.click()                          # 현재 위치 클릭
pyautogui.click(800, 600)                  # 지정 좌표 클릭
pyautogui.doubleClick()                    # 더블클릭
pyautogui.rightClick()                     # 우클릭
pyautogui.scroll(-500)                     # 아래로 스크롤

하나씩 뜯어볼게요 💡

  • moveTo(x, y, duration) : 지정 좌표로 마우스를 이동해요. duration을 주면 사람처럼 부드럽게 움직입니다.
  • click(x, y) : 좌표를 넣으면 이동 후 클릭, 안 넣으면 현재 위치를 클릭해요.
  • scroll(양수/음수) : 양수는 위로, 음수는 아래로 스크롤이에요.

💡 자동화할 버튼의 좌표를 알아내려면 터미널에서 python -m pyautogui를 실행해보세요. 마우스를 움직이면 실시간 좌표가 표시됩니다. 정말 편해요!

📌 2단계 - 키보드 제어하기

Python
import pyautogui

pyautogui.write("Hello, PyAutoGUI!", interval=0.05)  # 한 글자씩 타이핑
pyautogui.press("enter")                              # 엔터 한 번
pyautogui.hotkey("ctrl", "s")                         # 단축키 조합 (Ctrl+S)
pyautogui.hotkey("alt", "tab")                        # 창 전환
  • write(문자열, interval) : 키보드로 문자열을 입력해요. interval은 글자 사이 간격(초)이에요.
  • press(키 이름) : enter, tab, esc, f5 같은 특수키를 한 번 눌러요.
  • hotkey(키1, 키2, ...) : 여러 키를 동시에 누르는 단축키 조합이에요.

⚠️ 그런데 여기서 아주 중요한 함정이 하나 있어요. pyautogui.write()는 한글을 입력하지 못합니다! 영문·숫자만 지원하거든요. 한글은 pyperclip으로 클립보드에 복사한 뒤 Ctrl+V로 붙여넣는 방식을 써야 해요.

Python
import pyautogui
import pyperclip

def 한글입력(text):
    pyperclip.copy(text)              # 클립보드에 복사
    pyautogui.hotkey("ctrl", "v")     # 붙여넣기

한글입력("안녕하세요! 파이썬이 대신 입력하고 있어요 😎")

📌 3단계 - 화면 인식으로 버튼 찾기 (좌표 하드코딩 탈출!)

좌표를 직접 적어두면 창 위치가 바뀌는 순간 다 깨져요. 그래서 실전에서는 버튼 이미지를 캡처해두고, 화면에서 그 이미지를 찾아 클릭하는 방식을 씁니다.

Python
import pyautogui

# 미리 캡처해둔 button.png를 화면에서 찾아서 클릭
location = pyautogui.locateCenterOnScreen("button.png", confidence=0.8)
if location:
    pyautogui.click(location)
else:
    print("버튼을 찾지 못했어요 😢")
  • locateCenterOnScreen(이미지, confidence) : 화면에서 이미지와 닮은 영역을 찾아 중심 좌표를 돌려줘요.
  • confidence : 유사도 기준(0~1)이에요. 이 옵션을 쓰려면 pip install opencv-python이 필요합니다. 0.8 정도가 무난해요.

📌 전체 코드 (복붙 OK)

메모장을 열고, 업무 메모를 자동으로 타이핑한 뒤 저장 창까지 띄우는 예제예요. 실행하고 5초 안에 손 떼고 구경만 하세요!

Python
# PyAutoGUI 0.9.54 / Python 3.8+ / Windows 기준
import time
import subprocess
import pyautogui
import pyperclip

pyautogui.FAILSAFE = True   # 마우스를 화면 왼쪽 위 모서리로 던지면 긴급 정지!
pyautogui.PAUSE = 0.3       # 모든 동작 사이 0.3초 대기 (안정성 ↑)

def 한글입력(text):
    """write()는 한글이 안 되므로 클립보드 경유로 입력"""
    pyperclip.copy(text)
    pyautogui.hotkey("ctrl", "v")

def main():
    print("5초 뒤 시작합니다. 마우스에서 손 떼세요!")
    time.sleep(5)

    # 1) 메모장 실행
    subprocess.Popen(["notepad.exe"])
    time.sleep(1.5)  # 창이 뜰 때까지 대기

    # 2) 업무 메모 자동 작성
    한글입력("[자동 작성 메모]")
    pyautogui.press("enter")
    한글입력("오늘 할 일: 보고서 정리, 메일 회신, 데이터 백업")
    pyautogui.press("enter")
    pyautogui.write("written by PyAutoGUI :)", interval=0.05)

    # 3) 저장 대화상자 열기 (Ctrl+S)
    pyautogui.hotkey("ctrl", "s")
    print("완료! 저장 창에서 파일명만 정해주세요.")

if __name__ == "__main__":
    main()
  • FAILSAFE = True : 자동화가 폭주할 때 마우스를 화면 왼쪽 위 모서리(0,0) 로 확 밀면 FailSafeException이 나면서 즉시 멈춰요. GUI 자동화의 생명줄이니 절대 끄지 마세요!
  • PAUSE = 0.3 : 모든 pyautogui 동작 사이에 자동으로 딜레이를 넣어요. 프로그램 반응 속도보다 스크립트가 빨라서 생기는 오작동을 막아줍니다.
  • time.sleep(1.5) : 메모장이 뜨기 전에 타이핑하면 허공에 입력돼요. 창 로딩 대기는 필수!

📌 실행 결과

스크립트를 실행하면 5초 뒤 메모장이 스르륵 열리고, 커서가 저절로 움직이면서 메모가 타이핑됩니다. 마지막에 저장 대화상자까지 자동으로 뜨는 걸 볼 수 있어요. 처음 보면 좀 신기하면서 무섭습니다 😂

📌 자주 나는 에러

  1. ImageNotFoundException — locateCenterOnScreen이 이미지를 못 찾을 때 나요. 원인: 화면 배율(디스플레이 150% 등)이 캡처 당시와 다르거나, confidence가 너무 높은 경우. 해결: 윈도우 디스플레이 배율 100%에서 다시 캡처하거나 confidence를 0.7~0.8로 낮추세요. (confidence 옵션은 opencv-python 설치 필수!)
  2. 한글이 ㅇㅅㅇ처럼 깨져 입력됨 — write()로 한글을 넣으려 한 경우예요. 원인: write()는 영문 키 입력만 지원. 해결: 위의 pyperclip + Ctrl+V 방식으로 바꾸세요.
  3. FailSafeException — 마우스가 화면 모서리에 닿으면 발생해요. 원인: 긴급 정지 기능이 작동한 것(정상!). 실수로 자주 걸린다면 moveTo 좌표가 모서리에 너무 가깝지 않은지 확인하세요.

💡 보너스 팁

  • 자동화 스크립트가 도는 동안엔 컴퓨터를 건드리면 안 돼요. 마우스·키보드를 뺏어 쓰는 방식이라 사람이 개입하면 꼬입니다. 점심시간 같은 때 돌리는 게 국룰!
  • 반복 작업이라면 #6편에서 배운 schedule과 조합해 "매일 오후 6시에 자동 실행"도 가능해요.

📌 마무리

오늘은 PyAutoGUI로 마우스 이동·클릭, 키보드 입력(한글 포함!), 화면 이미지 인식까지 GUI 자동화의 핵심을 전부 다뤄봤어요. API가 없는 옛날 프로그램도 이제 파이썬으로 자동화할 수 있게 된 거죠!

다음 편에서는 또 다른 실전 업무 자동화 주제로 찾아올게요. 기대해주세요 🙌

📚 파이썬 업무 자동화 시리즈

  1. #1 - 엑셀 자동화 입문 (openpyxl)
  2. #2 - 웹 크롤링 입문 (requests + BeautifulSoup)
  3. #3 - 파일 정리 자동화 (이름 일괄 변경)
  4. #4 - 디스코드 웹훅(Webhook)으로 알림 보내기
  5. #5 - 로컬 LLM(LM Studio)으로 고객 문의 자동 분류·요약
  6. #6 - 예약 실행 자동화 (schedule·APScheduler)
  7. #7 - 동적 페이지·로그인 자동화 (Selenium)
  8. #8 - PDF 자동 처리 (pypdf)
  9. #9 - 마우스·키보드 GUI 자동화 (PyAutoGUI) ← 지금 이 글!

연재 · 14편 중 9번째

파이썬 업무 자동화

  1. #1엑셀 자동화 입문 (openpyxl)!
  2. #2웹 크롤링 입문 (requests + BeautifulSoup)!
  3. #3파일 정리 자동화 (이름 일괄 변경)!
  4. #4디스코드 웹훅(Webhook)으로 알림 보내기 (requests)!
  5. #5로컬 LLM(LM Studio)으로 고객 문의 자동 분류·요약하기! (무료 AI)
  6. #6예약 실행 자동화! 매일 정해진 시간에 스크립트 돌리기 (schedule·APScheduler)
  7. #7동적 페이지·로그인 자동화! requests로 안 되는 사이트 긁기 (Selenium)
  8. #8PDF 자동 처리! 여러 파일 병합·분할부터 비밀번호까지 (pypdf) 📄
  9. #9마우스·키보드 GUI 자동화! 클릭·타이핑을 파이썬이 대신하게 하기 (PyAutoGUI)지금 읽는 글
  10. #10워드(Word) 문서 자동 생성! 엑셀 명단으로 계약서·안내문 100장 뽑기 (python-docx) 📄
  11. #11개인화 대량 메일 자동 발송! 명단별 첨부파일·발송 로그·재시도까지 (smtplib 실전편) 📬
  12. #12구글 시트 연동하기! 팀원과 같이 보는 자동 시트 (gspread) 📗
  13. #13파이썬 자동화 로그·재시도·디스코드 실패 알림 만들기 - 조용히 멈추는 스크립트 잡기
  14. #14파워포인트(PowerPoint) 보고서 자동 생성! 엑셀 숫자만 바꾸면 발표자료 완성 (python-pptx) 📊
전체 14편 보기접기

글쓴이

Mojangcam

직접 코드를 짜고, 서버를 돌리고, 막힌 에러를 해결하며 배운 것들을 기록하는 개발·IT 실전 기록 블로그