파이썬 예외 로그 남기기 — 스크립트가 조용히 죽을 때 원인을 파일로 잡는 법, 함정 4가지 (실측)

파이썬 예외 로그 남기기 — 스크립트가 조용히 죽을 때 원인을 파일로 잡는 법, 함정 4가지 (실측)

터미널에서 직접 돌릴 때는 멀쩡히 오류 메시지를 보여 주던 스크립트가, 작업 스케줄러나 백그라운드로 돌리면 아무 말 없이 멈춰 있는 경우가 있습니다. 결과 파일이 안 생겼다는 사실만 다음 날 알게 되고, 어디서 왜 죽었는지는 알 길이 없습니다. 이번 글에서는 파이썬 예외 로그 남기기를 표준 라이브러리 logging만으로 구성해, 잡은 예외든 놓친 예외든 스레드 안의 예외든 트레이스백까지 로그 … 더 읽기

파이썬 소수점 오차 — 0.1+0.2가 0.3이 아닐 때, 금액 계산 89,919건 실측

파이썬 소수점 오차 — 0.1+0.2가 0.3이 아닐 때, 금액 계산 89,919건 실측

파이썬에서 0.1 + 0.2를 출력하면 0.30000000000000004가 나옵니다. 이 파이썬 소수점 오차는 유명하지만, 금액 계산에서 실제로 얼마나 자주 틀리는지는 재 본 적이 없었습니다. 그래서 100원부터 100,000원까지 10원 단위 가격 9,991개에 할인율·세율 9가지를 곱해, 모두 89,919건을 정확한 분수 계산과 비교했습니다. 원 미만을 int()로 버리는 흔한 코드는 3,501건(3.89%)에서 1원씩 적게 나왔습니다. 180원의 35%가 63원이 아니라 62원으로 계산되는 식입니다. … 더 읽기

RecursionError 해결 — 재귀 깊이 초과 원인과 반복문으로 바꾸기 (실측)

RecursionError 해결 — 재귀 깊이 초과 원인과 반복문으로 바꾸기 (실측)

파이썬에서 트리 구조 데이터를 재귀 함수로 훑다가 RecursionError: maximum recursion depth exceeded를 만나면 보통 “재귀 한도가 1000이니까 1000단계를 넘었구나” 하고 sys.setrecursionlimit()부터 올립니다. 그런데 직접 돌려 보니 단순하지 않았습니다. 중첩 댓글 개수를 세는 함수가 한도 1000에서 깊이 499에 멈췄고, 한도를 100만으로 올려도 어떤 재귀는 약 1,500단계에서 그대로 같은 오류를 냈습니다. 이 글에서는 RecursionError가 나는 실제 경계, … 더 읽기

JSONDecodeError 해결 — 깨진 JSON 파일에서 틀린 곳 정확히 찾아내기 (10가지 유형 실측)

JSONDecodeError 해결 — 깨진 JSON 파일에서 틀린 곳 정확히 찾아내기 (10가지 유형 실측)

설정 파일이나 API 응답을 json.load()로 읽다가 JSONDecodeError가 나면 메시지에 줄과 칸 번호가 찍힙니다. 그런데 그 위치로 가 봐도 틀린 게 안 보일 때가 많습니다. 직접 깨진 JSON 파일 10종을 만들어 돌려 보니, 쉼표가 빠진 파일은 쉼표가 빠진 6번 줄이 아니라 다음 줄인 7번 줄을 가리켰고, 원인이 다른 세 파일(마지막 쉼표·작은따옴표·주석)은 똑같은 메시지를 냈습니다. 이 글에서는 … 더 읽기

파이썬 메모리 사용량 줄이기 — 큰 파일 한 번에 읽지 않는 법, 512MB CSV로 방식별 실측

파이썬 메모리 사용량 줄이기 — 큰 파일 한 번에 읽지 않는 법, 512MB CSV로 방식별 실측

로그나 CSV가 커지면 잘 돌던 스크립트가 어느 날 MemoryError를 내거나, 작업 관리자에서 파이썬 하나가 몇 GB를 잡고 PC 전체가 느려집니다. 원인은 대부분 코드 한 줄, 파일을 “한 번에” 읽는 습관입니다. 이 글에서는 파이썬 메모리 사용량 줄이기를 주제로, 같은 512MB CSV(1,500만 행)를 일곱 가지 방식으로 읽어 같은 집계를 내고 최대 메모리를 직접 재 봤습니다. 이 노트북(윈도우 … 더 읽기

파이썬 requests가 응답 없이 멈출 때 — timeout·재시도 실측

파이썬 requests가 응답 없이 멈출 때 — timeout·재시도 실측

파이썬으로 API를 부르거나 웹페이지를 가져오는 스크립트가 아무 오류 없이 멈춰 있는 경우가 있습니다. 대부분 requests timeout을 지정하지 않았거나, 지정했더라도 그 의미를 잘못 알고 있어서 생깁니다. 이 노트북(윈도우 11, Python 3.12, requests 2.34.2, urllib3 2.7.0)에 일부러 느리게 응답하는 테스트 서버를 띄워 놓고 직접 재 봤습니다. 가장 의외였던 결과는 timeout=5를 줬는데도 요청이 19.01초 동안 끝나지 않은 것이었습니다. … 더 읽기

git 커밋 파일 삭제 —실수로 올린 큰 파일·비밀키를 히스토리에서 완전히 지우기 (실측)

git 커밋 파일 삭제 —실수로 올린 큰 파일·비밀키를 히스토리에서 완전히 지우기 (실측)

백업 압축 파일이나 API 키가 든 설정 파일을 깃에 같이 올렸다는 걸 뒤늦게 알면, 보통 git rm으로 지우고 커밋합니다. 그런데 git 커밋 파일 삭제는 그렇게 끝나지 않습니다. 이 노트북(윈도우 11, git 2.55)에서 50MB 파일과 가짜 비밀키를 커밋했다가 git rm으로 지우는 상황을 그대로 재현해 봤더니, 파일은 목록에서 사라졌지만 .git 폴더는 여전히 50.0MB였고, 원격에서 새로 clone한 사람도 … 더 읽기

파일 인코딩 일괄 변환 — 한글 텍스트 파일을 한 번에 UTF-8로 바꾸기 (파이썬 실측)

파일 인코딩 일괄 변환 — 한글 텍스트 파일을 한 번에 UTF-8로 바꾸기 (파이썬 실측)

예전 윈도우 프로그램이 저장한 CSV나 메모장 파일은 CP949(ANSI)로, 요즘 도구가 만든 파일은 UTF-8로 저장돼 한 폴더 안에 인코딩이 섞이는 일이 흔합니다. 그래서 파일 인코딩 일괄 변환 스크립트를 파이썬 표준 라이브러리만으로 만들어 이 노트북(윈도우 11, 파이썬 3.12)에서 실제로 돌려봤습니다. 먼저 인코딩 자동 감지 라이브러리(charset-normalizer)에 맡겨 봤는데, CP949로 저장한 11바이트짜리 “안녕하세요”를 big5(중국어 번체)로 판정했고, 그대로 변환하면 “寰喟ж撮蹂”라는 … 더 읽기

스크립트 중복 실행 방지 — 두 번 돌아 같은 일을 또 할 때 막는 법 (파이썬 실측)

스크립트 중복 실행 방지 — 두 번 돌아 같은 일을 또 할 때 막는 법 (파이썬 실측)

스케줄러가 한 번, 사람이 급해서 손으로 한 번. 같은 스크립트가 두 번 돌면 메일이 두 통 나가고, 글이 두 편 올라가고, 결제가 두 번 됩니다. 스크립트 중복 실행 방지는 보통 “잠금 파일 하나 만들면 되지” 하고 넘어가는데, 실제로 그 흔한 방식을 같은 순간에 5개씩 띄워 20번 돌려보니 20번 중 12번은 두 개 이상이 동시에 통과했습니다. … 더 읽기

예약 발행이 엉뚱한 시각에 나갈 때 — 타임존 점검 순서 5단계

예약 발행이 엉뚱한 시각에 나갈 때 — 타임존 점검 순서 5단계

블로그 글을 “내일 오전 9시”로 예약했는데 실제로는 오후 6시에 올라가 있거나, 반대로 새벽에 먼저 공개돼 버리는 경우가 있습니다. 차이가 정확히 9시간이라면 거의 100% 시간대(타임존) 문제입니다. 한국 표준시는 UTC보다 9시간 빠르기 때문에, 어딘가 한 곳이 UTC로 계산하고 다른 곳이 한국 시각으로 계산하면 그 차이가 그대로 발행 시각에 찍힙니다. 이번 글에서는 예약 발행 시간이 안 맞을 때 … 더 읽기