개발 취재 노트
파이썬 스크립트 import가 표준 라이브러리 대신 내 파일을 읽는다면, 파일 이름이 inspect.py인지부터 보자
자동 콘텐츠 생성 파이프라인(content-loop-mvp)의 채점이 기준을 못 넘기던 때, 항목별 점수를 찍어 볼 진단 스크립트를 만들고 있었다. Windows 11에서 그 스크립트를 실행하려는데 실행이 되지 않았고, 원인으로 파일 이름 inspect.py가 지목됐다.
결론
파이썬은 모듈을 찾을 때 실행한 스크립트가 있는 폴더를 표준 라이브러리(파이썬에 기본으로 딸려 오는 모듈 묶음)보다 먼저 뒤진다. 그래서 같은 폴더에 inspect.py가 있으면 import inspect는 표준 라이브러리의 inspect 대신 그 파일을 읽는다. 확인은 한 줄이면 된다.
python -c "import inspect; print(inspect.__file__)"
출력 경로가 내 프로젝트 폴더의 inspect.py를 가리키면 표준 라이브러리가 가려진 것이다.
이 세션에서는 이 한 줄을 돌려 확인하지 않았다. 이름을 바꿔 다시 돌리려 했지만 스크래치패드에 남아 있던 옛 inspect.py가 여전히 같은 자리에서 잡혔고 , 기록은 세션 한도에 걸려 그 자리에서 끊긴다 .
이름을 바꿨는데도 같은 자리에서 걸리면 다음 세 가지를 한다.
- 옛
inspect.py를 지운다. 지우기 싫으면 다른 폴더로 옮긴다. - 실행하는 폴더에서
dir *.py(맥·리눅스는ls *.py)로 표준 라이브러리 이름과 같은.py가 더 없는지 본다. - 위 한 줄을 다시 돌려
inspect.__file__이 표준 라이브러리 경로를 가리키는지 확인한다.
상황
content-loop-mvp는 주제 후보를 만들고, 웹에서 근거를 모아 교차 확인하고, 글을 쓰고, 별도 모델이 심사해 통과한 글만 저장하는 한국어 콘텐츠 자동 생성 파이프라인이다. 원래 네 단계 모두 OpenAI 또는 Gemini의 API 키가 있어야 돌아가는 구조였다 . 이 세션에서는 API 키 없이 claude와 codex의 CLI를 하위 프로세스로 불러 모델 호출을 대신하기로 했다 . 네 단계가 실제로 claude로 돌아간 것은 그다음이다 . 기준(최소 주제점수 75)은 낮추지 않는다는 조건이었다 .
문제는 기준 그대로 다섯 번 돌려도 글이 한 편도 나오지 않은 것이었다. 주제 점수 최고치는 74점에 머물렀다 . 채점 프롬프트에 항목별 기준을 넣고 다시 돌려도 최고 점수는 72~74였다 . 그래서 후보 하나의 항목별 점수를 한 번 찍어 보는 진단 스크립트를 짜기로 했다 .
증상
진단 스크립트 실행이 실패했다. AI는 "파일명이 inspect.py라서 표준 라이브러리 inspect를 가리는 충돌"이라고 판단하고 이름을 바꿔 다시 돌리기로 했다 . 다만 이 기록에는 에러 메시지 원문이 없다. 어떤 에러가 났는지, 그 에러가 정말 inspect 가림 때문이었는지 확인할 문장은 남아 있지 않다.
원인
기록에 남은 원인은 "파일 이름이 inspect.py라서"뿐이다. 이름이 표준 라이브러리 모듈과 겹치는 것은 사실이고, 위 한 줄로 가림 여부는 바로 확인할 수 있다. 하지만 이 세션에서 그 확인은 이뤄지지 않았다. 그러니 이 세션에서 확정된 원인이라고 쓸 수는 없다.
해결
이름을 바꿔 재실행하려 했지만, 스크래치패드에 남아 있던 inspect.py가 여전히 같은 자리에서 잡혔다 . 옛 파일을 지우고 다시 돌리려던 순간 세션 한도에 걸렸다 . 그래서 이 글에서 "해결됐다"고 쓸 수 없다. 해결은 옛 파일을 지운 뒤 위 한 줄로 어느 파일을 읽는지 찍어 보는 데까지 가야 끝난다.
덤 — 이름을 바꾸는 것과 옛 파일을 치우는 것은 다르다
이름을 바꾸면 새 파일은 피하지만, 같은 폴더에 있던 옛 파일은 그대로 남아 계속 잡힌다. 파일 이름을 고쳤다면 그 폴더에 표준 라이브러리 이름과 같은 .py 파일이 더 없는지 목록으로 한 번 더 봐야 한다. 진단 스크립트를 임시 폴더에 두는 것도 같은 함정을 만든다.
취재 후기 — 이름 하나 바꾸고 끝난 줄 알았다
주제 후보 점수를 항목별로 찍어 보려던 진단 스크립트가 실행되지 않는다. 에러 문구를 그대로 옮겨 적은 메모는 없다.
inspect.py인 게 문제 같아. 표준 라이브러리 inspect랑 겹쳐서 그런 거야 inspect.py가 있으면 표준 라이브러리보다 먼저 잡혀. 그러니까 이름부터 바꾸면 끝이야inspect.__file__이 내 폴더 경로를 찍어야 해. 찍어 보기 전엔 가설이야inspect.py가 그대로 남아 있었어