지금까지 배운 엑셀 데이터 합치기, 파일 정리, 웹 크롤링, 그리고 이메일 발송 스크립트는 이미 업무 시간을 몇 시간씩 단축해 주는 훌륭한 도구입니다. 하지만 한 가지 아쉬운 점이 있습니다. 바로 매번 사람이 컴퓨터 앞에 앉아 직접 파이썬 실행 버튼(Run)을 눌러주어야 한다는 사실입니다.

매일 아침 9시 정각에 뉴스 크롤링을 실행하거나, 매주 금요일 오후 5시에 주간 보고서 엑셀 파일을 생성하여 메일로 발송하는 작업 등은 실행하는 시점까지 일정하게 정해져 있는 경우가 많습니다. 사람이 직접 기억하고 챙기다 보면 회의나 바쁜 업무 중에 타이밍을 놓치는 일이 발생할 수밖에 없습니다.

저 역시 초기에는 매일 오후 6시에 환율 데이터를 수집하는 스크립트를 만들어두고도 정작 퇴근 준비를 하다가 깜빡하고 실행하지 못해 야근을 했던 경험이 있습니다. 오늘은 사람의 개입을 완전히 배제하고, 파이썬 스스로 시계를 보며 매일 정해진 시간이나 주기에 따라 알아서 코드를 실행하게 만드는 schedule 모듈 활용법을 정리해 드립니다.


1. 직관적인 파이썬 일정 예약 도구: schedule 모듈

파이썬에서 일정 시간마다 특정 함수나 코드를 반복 실행하는 방법은 여러 가지가 있습니다. 파이썬 기본 내장 모듈인 time.sleep()이나 threading을 활용할 수도 있고, 윈도우의 '작업 스케줄러(Task Scheduler)'를 이용할 수도 있습니다.

하지만 초보자 입장에서 가독성이 가장 뛰어난 방법은 직관적인 문법을 제공하는 라이브러리인 schedule을 사용하는 것입니다.

schedule 모듈은 마치 사람이 말하는 영어 문장처럼 코드를 작성할 수 있어, 누구나 코드를 보는 순간 몇 분/몇 시간/무슨 요일에 작업이 실행될지 한눈에 파악할 수 있다는 강력한 장점이 있습니다.

필수 라이브러리 설치

명령 프롬프트(cmd)나 터미널에서 아래 명령어를 입력하여 설치합니다.

pip install schedule


2. schedule 모듈의 기본 문법 및 주기 설정법

schedule 모듈은 다음과 같은 다양한 방식으로 예약 시간을 자유자재로 구성할 수 있습니다.

  • 초/분/시간 단위 설정: schedule.every(10).seconds.do(job) (10초마다 실행)

  • 매일 특정 시각 설정: schedule.every().day.at("09:00").do(job) (매일 아침 9시 실행)

  • 특정 요일 시각 설정: schedule.every().monday.at("18:00").do(job) (매주 월요일 저녁 6시 실행)

  • 시간 간격 지정: schedule.every(2).hours.do(job) (2시간마다 실행)

이처럼 직관적인 언어로 스케줄을 등록한 뒤, 프로그램이 계속 켜져 있으면서 시계를 체크하도록 무한 루프(while True)를 돌려주는 것이 핵심 구조입니다.


3. 실전 예제: 매일 아침 자동 실행되는 스케줄러 구축

배운 내용을 바탕으로 매일 아침 9시와 10분마다 주기적으로 특정 작업(함수)을 실행하는 실전 스크립트를 작성해 보겠습니다.

Python
import schedule
import time
from datetime import datetime

# 1. 정해진 시간에 실행하고 싶은 자동화 작업(함수) 정의
def daily_report_task():
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"[{now}] 매일 아침 자동화 리포트 생성을 시작합니다.")
    # 이 부분에 이전에 작성한 크롤링, 엑셀 정리, 이메일 발송 코드가 들어갑니다.
    print(f"[{now}] 작업이 성공적으로 완료되었습니다.\n")

def check_system_task():
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"[{now}] 시스템 상태를 주기적으로 점검합니다.")

# 2. 일정(Schedule) 등록하기
# 매일 아침 09:00에 daily_report_task 함수 실행
schedule.every().day.at("09:00").do(daily_report_task)

# 10분마다 check_system_task 함수 실행
schedule.every(10).minutes.do(check_system_task)

print("=== 파이썬 자동 스케줄러가 정상적으로 시작되었습니다 ===")
print("프로그램을 종료하려면 Ctrl + C를 누르세요.")

# 3. 등록된 스케줄을 지속적으로 감시하는 무한 루프
while True:
    # 대기 중인 스케줄 작업이 있는지 확인하고 실행
    schedule.run_pending()
    
    # CPU 과부하를 방지하기 위해 1초씩 휴식하며 대기
    time.sleep(1)

코드의 핵심 포인트: schedule.run_pending()과 time.sleep(1)

  • schedule.run_pending(): 등록된 스케줄 중 "지금 실행할 시간이 된 작업"이 있는지 체크하고, 조건이 만족되면 해당 함수를 호출합니다.

  • time.sleep(1): while True 무한 루프 안에서 time.sleep(1)을 주지 않으면 컴퓨터의 CPU 점유율이 100%까지 치솟게 됩니다. 1초 간격으로 쉬면서 시계를 확인하도록 조절해 주는 안전장치입니다.


4. 24시간 끊김 없이 스케줄러를 가동할 때 주의할 점 2가지

파이썬 schedule 모듈을 활용해 완벽한 '무인 자동화' 시스템을 만들 때 꼭 고려해야 하는 실무 주의사항입니다.

1) 예외 처리(try-except)의 필수 적용

예약된 시간에 실행되는 작업 함수 내부에서 인터넷 끊김이나 엑셀 파일 열림 오류 등으로 에러가 발생하면, 파이썬 프로그램 전체가 다운되어 다음 예약 일정까지 모두 마비됩니다.

따라서 작업 함수 내부의 전체 코드는 반드시 try-except 구문으로 감싸서 에러가 터지더라도 로그만 남기고 스케줄러 프로그램 자체는 계속 살아있도록 방어막을 구축해야 합니다.

2) 컴퓨터 수면 모드 방지 및 서버 환경

내 컴퓨터에서 파이썬 스케줄러를 돌릴 때 컴퓨터가 '절전 모드(수면 모드)'에 들어가면 컴퓨터의 시계도 멈추므로 지정된 시간에 스크립트가 실행되지 않습니다.

24시간 끊김 없이 작동해야 하는 중요한 업무 스케줄러라면, 절전 모드를 해제하거나 클라우드 가상 서버(AWS, Google Cloud 등)에 파이썬 프로그램을 올려두는 방식을 고려하는 것이 좋습니다.


핵심요약

  • schedule 모듈은 매일/매주/매분 단위로 파이썬 코드가 자동으로 실행되도록 시간을 예약해 주는 라이브러리입니다.

  • schedule.every().day.at("09:00").do(함수)와 같이 영문장 형태의 직관적인 구문으로 쉽게 작성할 수 있습니다.

  • 스케줄러 작동 중 예외 발생으로 인한 프로그램 다운을 막기 위해 함수 내부 예외 처리(try-except)와 time.sleep(1) 대기 설정이 필수적입니다.