Python 표준 라이브러리의 atexit 모듈은 프로그램이 정상적으로 종료될 때 특정 함수를 자동으로 실행해 주는 기능을 제공합니다. 이 모듈에는 register()와 unregister() 두 가지 함수가 있으며, 두 함수 모두 이미 정의된 함수를 인자로 받습니다.
register()로 등록된 함수들은 인터프리터 세션이 정상적으로 끝나는 시점에 자동으로 호출됩니다.
등록 순서와 실행 순서
여러 개의 함수가 등록되면, 실행 순서는 등록된 순서의 역순(후입선출)입니다. 예를 들어 f1(), f2(), f3() 순서로 등록했다면 실제 실행 순서는 f3() → f2() → f1()이 됩니다.
unregister() 함수는 자동 호출 목록에서 지정한 함수를 제거하는 역할을 합니다.
기본 사용 예제
다음 코드는 프로그램 종료 시 자동으로 실행될 함수를 등록하는 방법을 보여줍니다. (주의: 이 코드는 IDLE이 아닌 명령줄에서 실행해야 합니다.) 프로그램은 사용자에게 숫자를 계속 입력받아 더하고, 반복문이 끝나면 등록된 savetotal() 함수가 자동으로 호출되어 합계를 파일에 저장합니다.
import atexit
sum = 0
def savetotal():
fo = open("atexit.txt","w")
fo.write(str(sum))
print ("sum written to file")
fo.close()
atexit.register(savetotal)
while True:
n = int(input("enter a number. -1 to exit"))
if n == -1:
break
sum = sum + n
print (sum)
위 코드를 atexit-example.py로 저장한 뒤 명령줄에서 실행합니다. 입력된 숫자들이 차례로 더해지고, 프로그램이 끝나는 시점에 총합이 atexit.txt 파일에 기록됩니다.
C:\python36>python atexit-example.py enter a number. -1 to exit4 enter a number. -1 to exit6 enter a number. -1 to exit3 enter a number. -1 to exit5 enter a number. -1 to exit2 enter a number. -1 to exit-1 20 sum written to file
실행 결과 현재 디렉터리에 atexit.txt 파일이 생성되며, 총합(이 예제에서는 20)이 저장됩니다.
인자를 가진 함수 등록하기
인자가 있는 함수도 등록할 수 있습니다. 이 경우 각 인자 조합마다 독립적으로 등록되며, 역시 등록된 역순으로 실행됩니다.
import atexit
names = ['Ashok', 'Radha', 'Abdul', 'John']
def hello(name):
print ("Hello",name)
for name in names:
atexit.register(hello,name)
실행 결과:
C:\python36>python atexit-example2.py Hello John Hello Abdul Hello Radha Hello Ashok
atexit.unregister(hello)를 호출하면 다양한 인자로 등록된 hello()의 모든 사본이 자동 호출 목록에서 제거됩니다.
데코레이터 문법 활용
함수를 등록하는 더 간편한 방법으로 register()를 데코레이터처럼 사용할 수 있습니다.
import atexit
@atexit.register
def hello():
print('Hello World!')
print('Say Hello')
실행 결과:
C:\python36>python atexit-example3.py Say Hello Hello World!
주의 사항 및 활용 방안
프로그램이 비정상적으로 강제 종료되거나 os._exit() 함수가 호출되는 경우에는 등록된 함수가 자동으로 실행되지 않습니다. 따라서 중요한 정리 작업만 atexit에 의존해서는 안 되며, 필요하다면 try-finally 구문과 함께 사용하는 것이 안전합니다.
atexit 모듈은 데이터베이스 연결 종료, 열려 있는 파일 닫기, 시스템 자원 해제 같은 정리(cleanup) 작업을 자동화할 때 매우 유용하게 활용됩니다.