개발 취재 노트

파이썬 스크립트 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가 여전히 같은 자리에서 잡혔고 , 기록은 세션 한도에 걸려 그 자리에서 끊긴다 .

이름을 바꿨는데도 같은 자리에서 걸리면 다음 세 가지를 한다.

  1. 옛 inspect.py를 지운다. 지우기 싫으면 다른 폴더로 옮긴다.
  2. 실행하는 폴더에서 dir *.py(맥·리눅스는 ls *.py)로 표준 라이브러리 이름과 같은 .py가 더 없는지 본다.
  3. 위 한 줄을 다시 돌려 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 파일이 더 없는지 목록으로 한 번 더 봐야 한다. 진단 스크립트를 임시 폴더에 두는 것도 같은 함정을 만든다.

취재 후기 — 이름 하나 바꾸고 끝난 줄 알았다

주제 후보 점수를 항목별로 찍어 보려던 진단 스크립트가 실행되지 않는다. 에러 문구를 그대로 옮겨 적은 메모는 없다.

정바다
진단 스크립트가 안 돌아. 주제 점수가 왜 74에서 멈추는지 찍어 보려고 만든 건데, 이름이 inspect.py인 게 문제 같아. 표준 라이브러리 inspect랑 겹쳐서 그런 거야
정하늘
그 에러가 inspect 때문이라는 걸 어떻게 확인했는데? 이름이 같다는 건 짐작이고, 어느 파일을 읽었는지는 본 적 없잖아
정바다
파이썬은 실행한 폴더를 제일 먼저 뒤진다고 알고 있어. 같은 이름이면 당연히 내 파일을 읽지
박도은
잠깐, 그 "제일 먼저 뒤진다"가 뭔데? 나는 import하면 파이썬이 알아서 찾는 줄 알았거든
정바다
모듈을 찾는 목록이 있어. 맨 앞이 실행한 폴더라서 inspect.py가 있으면 표준 라이브러리보다 먼저 잡혀. 그러니까 이름부터 바꾸면 끝이야
박도현
이름 바꾸면 끝이라는 게 제일 비싼 가정이야. 고쳐진 건지 안 보이게 된 건지 뭘로 갈라?
정하늘
바다 말이 맞으면 inspect.__file__이 내 폴더 경로를 찍어야 해. 찍어 보기 전엔 가설이야
정바다
찍는 건 나중에 해도 되잖아. 이름부터 바꿔서 다시 돌릴게
박도은
바꿨는데 같은 자리에서 또 걸리는데? 스크래치패드에 옛날 inspect.py가 그대로 남아 있었어
정바다
어? 바꾼 건 새 파일인데 옛 파일이 아직 남아 있었구나. 그 파일이 있는 한 이름을 뭘로 바꾸든 걸리는 거네
박도현
그래서 지금 상태가 뭔데? 고쳐진 거야, 숨긴 거야?
정하늘
둘 다 아니야. 옛 파일을 지우고 찍어 보는 게 다음 순서였는데, 그날 작업 한도가 차서 거기서 끊겼어
박도은
그럼 결과는 아직 모르는 거야?
정바다
응, 아직 아무도 몰라. 찍어 보기 전까지는 원인도 가설이야
박도현
그럼 남은 교훈은 하나야. 에러 문구를 먼저 붙잡고, 가설은 한 줄로 확인한 다음에 이름을 바꾸자