지난 글에서 카카오톡 봇 Iris를 관리자·랭킹·경제·경마·미니게임·경매·AI 등 9개 파일로 나눴다는 이야기를 했습니다. 이번 글은 그 과정에서 실제로 부딪힌, 파이썬을 오래 써도 은근히 잘 모르고 지나가는 함정 하나를 기록합니다.

증상: 봇이 두 번 뜬다

메인 파일 irispy.py를 python3 irispy.py로 직접 실행해서 봇을 띄웠습니다. 문제는 서브 모듈(예: 랭킹 기능 파일)에서 메인의 봇 인스턴스나 DB 헬퍼 함수를 쓰려고 import irispy를 했을 때 발생했습니다. 봇이 두 개가 뜬 것처럼 동작하거나, 초기화 로직이 중복 실행되는 이상한 증상이 나타났습니다.

원인: 직접 실행한 파일은 이름이 “irispy"가 아니다

파이썬에서 python3 파일명.py로 스크립트를 직접 실행하면, 그 파일은 파일명이라는 이름의 모듈이 아니라 특수한 이름인 __main__으로 등록됩니다. 그런데 서브 모듈에서 import irispy를 하면, 파이썬은 “아직 irispy라는 이름의 모듈이 import된 적이 없다"고 판단하고 그 파일을 처음부터 다시 통째로 읽고 실행합니다. 이미 __main__으로 한 번 실행된 코드가, 이번엔 irispy라는 별도의 모듈로 또 한 번 실행되는 것입니다. 결과적으로 봇 초기화 코드가 두 번 돌고, 서로 다른 두 개의 객체가 만들어지는 순환참조에 가까운 문제가 생겼습니다.

문제 해결 흐름

해결: sys.modules[’main’]에서 직접 꺼내 쓰기

해결 방법은 서브 모듈들이 import irispy로 다시 실행시키는 대신, 이미 떠 있는 메인 프로세스를 파이썬의 모듈 레지스트리에서 직접 찾아 쓰는 것이었습니다.

import sys
main = sys.modules['__main__']
bot = main.bot  # 이미 초기화된 봇 인스턴스를 그대로 참조

sys.modules는 현재 프로세스에서 이미 로드된 모든 모듈을 담고 있는 딕셔너리이고, 그 중 '__main__' 키는 항상 지금 직접 실행된 진입점 파일을 가리킵니다. 이 방식으로 서브 모듈들이 메인을 다시 실행시키지 않고도 이미 초기화된 객체들을 그대로 재사용할 수 있게 됐습니다.

돌아보며

이 문제는 사실 파이썬의 매우 기본적인 동작(직접 실행된 파일은 __main__이 된다)에서 비롯된 것이라, 알고 나면 당연합니다. 하지만 여러 파일로 기능을 나누는 리팩토링을 처음 해볼 때는 꽤 헷갈리기 쉬운 함정이라고 느꼈습니다. 파이썬으로 멀티 파일 애플리케이션을 짤 때 이 글이 비슷한 삽질을 줄이는 데 도움이 되었으면 합니다.

핵심 요약

🤖 이 포스팅은 AI의 도움을 받아 작성되었습니다.