당신은 회사에서 서울 양재 IC 근방의 교통량을 측정해 달라는 요청을 받았습니다. 당장 내일부터 일 주일간 교통량을 측정해 일 주일 후에 결과를 전달해야 합니다. 직접 양재 IC에 나가서 조사하는 대신 교통정보센터에서 제공하는 양재 IC 근방 CCTV를 보고 교통량을 측정하려고 합니다.

일 주일간 새벽 6시부터 밤 12시까지 30분 단위로 교통 흐름(원활, 서행, 지체) 조사해 달라고 합니다. 그래서 당신은 이제 쉬는 시간도 없이 30분마다 PC 모니터를 계속해서 봐야하는 상황입니다.
더 좋은 방법이 없을까요?
사람이 PC 모니터를 30분마다 계속 보고 교통 흐름을 파악하는 것은 정말 힘든 일입니다. 이러한 작업을 자동화할 방법을 찾아야 합니다. 이 경우에 사용할 수 있는 기법은 스케줄에 맞춰 스크린을 캡쳐 후 이미지 파일로 저장하는 것입니다. 이러면 나중에 저장한 이미지 파일을 이용해 지정한 시간에 교통 흐름을 한번에 평가할 수 있습니다. 이제 파이썬 코드로 이러한 작업을 수행해 봅시다.
이번 프로젝트의 미션은 다음과 같습니다.
이번 프로젝트를 파이썬으로 수행하기 위해 필요한 내용은 다음과 같습니다.
파이썬 기본 문법
함수와 모듈
이번 프로젝트에 필요한 사전 지식은 다음의 책에서도 확인할 수 있습니다. 특히 schedule 패키지를 사용하는 다양한 예제가 있으니 참고하면 도움이 될 것입니다.
이제 프로젝트를 수행해 보겠습니다. 먼저 파이썬을 이용해 사운드를 재생하는 방법을 알아보겠습니다. 그 후 컴퓨터 화면을 캡쳐하는 방법을 알아보고 마지막으로 스케줄을 지정해 함수를 실행하는 방법을 이용해 스케줄에 따라서 사운드를 재생하고 스크린 캡쳐하는 방법을 살펴보겠습니다.
윈도우를 사용하다 보면 우리는 다양한 사운드(Sound, 소리)를 접합니다. 즉, 윈도우 시작 사운드, 윈도우 종료 사운드, 뭔가 잘못됐을 때나는 오류 사운드 등 다양한 소리가 있습니다. 이러한 사운드를 위한 음원 파일(wave file)은 C:\Windows\Media 폴더에 존재합니다. 파이썬에는 음원을 재생할 수 있는 다양한 모듈이 있지만 여기서는 파이썬 내장 모듈인 winsound를 이용해 C:\Windows\Media 폴더에 있는 음원 파일(wave file) 재생하겠습니다.
다음은 winsound의 PlaySound(sound, flags)를 이용해 윈도우 설치 PC에서 C:\Windows\Media 폴더에 있는 음원 파일을 재생하는 코드입니다. 여기서는 sound에 음원 파일을 지정하기 때문에 flags에는 winsound.SND_FILENAME을 지정합니다.
import winsound
media_folder = 'C:/Windows/Media/'
wave_file = 'Windows Logon.wav'
sound = media_folder + wave_file
winsound.PlaySound(sound, winsound.SND_FILENAME)
위 코드를 실행하면 스피커로 소리가 나는 것을 들을 수 있습니다. 여기서는 'Windows Logon.wav' 파일을 이용했지만 C:\Windows\Media 폴더의 다른 음원 파일을 이용할 수 있습니다.
스크린 캡쳐를 위해서 PC에서 마우스와 키보드를 제어하고 스크린 캡쳐도 할 수 있는 pyautogui 모듈을 이용합니다. pyautogui 모듈은 파이썬 내장 모듈도 아니고 아나콘다 설치 시 기본적으로 설치가 되지 않기 때문에 윈도우 명령창에 다음과 같은 방법으로 설치합니다.
pip install pyautogui
스크린을 캡쳐해 이미지 파일로 저장하는 방법은 다음과 같습니다.
import pyautogui
pyautogui.screenshot(image_file, region=(left, top, width, height))
위에서 image_file는 경로를 포함한 이미지 파일 이름이고, left와 top는 각각 캡쳐할 스크린의 왼쪽 상단 모서리의 x 죄표와 y 좌표 위치이고, width와 height는 각각 캡쳐할 사각형의 폭과 높이입니다.

pyautogui를 활용하면 파이썬을 이용해 마우스와 키보드 제어하는 등 다양한 작업을 수행할 수 있습나다. 더 자세한 기능은 pyautogui 설명 사이트(https://pyautogui.readthedocs.io/)를 참조하세요.
import pyautogui
screen_shot_file = "./screen_capture.png"
screen_shot = pyautogui.screenshot(screen_shot_file, region=(0,30, 500, 400))
screen_shot
(출력 결과: 만약 주피터 노트북을 이용한다면 다음과 같이 출력됩니다.)
스크린 캡쳐 이미지를 살펴보면 지정한 구역에 대해 스크린 캡쳐가 잘 수행된 것을 볼 수 있습니다.
파이썬에서 스케줄러 패키지인 schedule을 이용하면 정해진 스케줄에 맞춰 코드를 실행할 수 있습니다. 여기서는 살펴본 내용을 바탕으로 사운드를 재생하는 play_windows_sound() 함수와 스크린을 캡쳐하는 capture_screen() 함수를 만들어 정해진 스케줄에 맞춰 실행하는 코드를 작성해 보겠습나다. schedule 사용을 위한 방법은 파이썬 웹 스크레이핑 도서의 3장을 참고하세요.
import schedule
import time
from datetime import datetime
import pyautogui
import winsound
count = 0
def play_windows_sound():
media_folder = 'C:/Windows/Media/'
wave_file = 'Windows Logon.wav'
sound = media_folder + wave_file
winsound.PlaySound(sound, winsound.SND_FILENAME)
def capture_screen():
now = datetime.now()
datetime_str = f"{now.year}-{now.month:02d}-{now.day:02d}_{now.hour:02d}_{now.minute:02d}_{now.second:02d}"
screen_shot_file = f"./screen_capture_{datetime_str}.png"
pyautogui.screenshot(screen_shot_file, region=(0,30, 500, 400))
def job():
global count
count = count + 1
play_windows_sound()
capture_screen()
schedule.every(1).minutes.do(job)
while True:
try:
schedule.run_pending()
time.sleep(1)
if(count == 4):
print("스케줄러 종료. 총 Capture 횟수:", count)
schedule.clear()
break
except:
print("작업 강제 종료")
schedule.clear()
break
스케줄러 종료. 총 Capture 횟수: 4
위의 코드를 수행하면 1분마다 사운드가 발생하며 스크린의 지정한 영역을 캡쳐해 이미지 파일로 저장합니다. 이것은 코드가 제대로 수행되는지 확인하기 1분으로 설정한 것입니다. 만약 30분마다 수행하도록 스케줄을 바꾸고 싶다면 위 코드의 schedule.every(1).minutes.do(job)를 schedule.every(30).minutes.do(job)로 변경하면 됩니다.
지금까지 파이썬에서 schedule 패키지를 이용해 정해진 스케줄에 따라서 사운드를 발생하고 스크린을 캡쳐하는 코드를 살펴봤습니다. 이 코드는 일정 시간 마다 알람을 발생해야 하거나 스크린을 캡쳐해야 될 필요가 있을 때 사용하면 편리하게 수동으로 작업하던 것을 좀 더 효율적으로 작업할 수 있을 것입니다.
참고로 스크림릿을 이용해 웹 앱을 제작하는 방법과 스케줄에 따라서 웹에서 데이터를 가져와 카카오톡으로 보내는 방법을 알고 싶다면 아래의 도서를 참고하세요.
