Performing Python repetitive tasks in Windows

살다 보면 어떤 Python 파일을 정기적으로 실행하고 싶을 때가 있다. 만약 리눅스라면 일반적으로 생각해 볼 수 있는 수단은 crontab일 것이다.

하지만 운영체제가 Windows라면 어떻게 해야 할까? 이 글에서는 글쓴이가 직접 사용중인 2가지 방법을 소개하려고 한다.

1. Windows Task Scheduler (작업 스케쥴러)

작업 스케쥴러는 말 그대로 Windows 에서 제공하는 작업 스케쥴러로 살펴보면 의외로 사용하기 편하고 여러 기능을 갖추고 있다. 문제는 Python Script 를 어떻게 동작시킬지인데 명령 프롬프트와 똑같이 작업하면 된다.

한글 Windows 10 기준

먼저 시작 메뉴에서 작업 스케쥴러 라고 치면 작업 스케쥴러가 나오게 되는데보통 아래와 같은 화면일 것이다.

필자의 작업스케쥴러 상황

컴퓨터 환경에 따라 항목이 많거나 적거나 할 수 있다.

이 화면에서 오른쪽에 보이는 작업 만들기를 클릭하면 새로운 창이 뜨면서 새로운 작업을 생성할 수 있게 된다. 트리거나 다른 탭들은 충분히 혼자서 설정할 수 있을 것이다. 이 글에서 중점적으로 살펴보려 하는 것은 동작 탭이다.

동작 탭을 클릭하고 새로 만들기를 클릭하면

또 다시 창이 하나 나온다. 보통은 프로그램/스크립트 쪽에 그냥 python을 넣는 경우가 많지만 이 글에서 제안하려는 방법은 다음과 같다.

프로그램/스크립트에는 cmd(명령 프롬프트)를 넣고 인수 추가(옵션)에는 아래와 같이 입력하자.

/k {파이썬 인터프리터의 절대경로} -i {실행하려는 파일의 절대경로}

cmd 실행 시 /k 옵션을 주면 cmd 창이 실행 후에도 남아있게 되어 편하다.인터프리터의 절대경로를 주는 이유는 괜히 상대경로로 하다가 꼬일 수 있고 요즘은 복붙도 무척 편하니 그냥 탐색기에서 경로를 복붙하도록 하자. -i 옵션은 파이썬 인터프리터의 옵션으로 도움말에는 아래와 같이 적혀 있다.

-i : inspect interactively after running script; forces a prompt even
 if stdin does not appear to be a terminal; also PYTHONINSPECT=x

해석해보면 표준입력이 들어오지 않더라도 항상 프롬프트를 유지시켜주므로 파이썬 인터프리터가 꺼지지 않게 된다. 만약 이 옵션을 설정하지 않을 경우 보통 명령 프롬프트는 프로세스가 정상적으로 종료되면(return 0) 꺼져버리기 때문에 결과를 확인할 수가 없다.

필자의 경우는 하루에 한 번 돌리는 작업이라 다음날

아래와 같이 성공했다는 보고를 받고 그냥 cmd창을 꺼버리는 식으로 이용하고 있다. 각자의 상황에 맞게 옵션을 조합해서 사용하면 된다.

2. apscheduler 이용

apscheduler는 https://apscheduler.readthedocs.io/en/latest/ 무척 유용한 라이브러리로 파이썬 코드 상에서 Batch Job 을 돌리기 무척 유용하다. 그런데 윈도우에서는 어떻게 백그라운드상에서 계속 이 스크립트를 돌릴 수 있을까?

윈도우 파이썬에는 python.exe 말고도 pythonw.exe 라는 파일이 또 있는데 이 실행파일을 이용해서 실행하면 작업이 백그라운드에서 이루어진다. 그래서 그냥 실행해놓으면 apscheduler 가 알아서 작업을 수행한다. 꺼버리고 싶을 때가 조금 문제인데 작업 관리자를 이용하면 된다.