"파이썬 설치돼 있으니까 그냥 python script.py 치면 되겠지"라고 생각하고 실행했는데, 동료가 짠 코드에서 print("hello")는 되는데 f-string이 문법 에러를 뿜는 상황. 아니면 로컬에서는 잘 돌던 스크립트가 서버에 올리니까 dict.items()의 순서가 꼬이는 일. 이런 미스터리의 범인은 대부분 파이썬 버전 불일치입니다.
특히 요즘은 Python 2는 거의 사라졌지만, Python 3 안에서도 3.8, 3.10, 3.12가 동시에 설치돼 있는 환경이 흔합니다. match 문(3.10+)이나 tomllib(3.11+) 같은 신기능을 썼다가 구버전 서버에서 터지는 사고, 한 번쯤은 겪게 됩니다.
# 터미널에서 그냥 python이라고 치고 실행
# "내 컴퓨터의 python이 뭔지는 모르지만 일단 돌려봐야지"
python my_script.py
어떤 python이 실행될지는 OS와 PATH 설정에 따라 다릅니다. macOS에서는 시스템 파이썬이 잡힐 수도 있고, 회사 장비에서는 3.8이, 개인 노트북에서는 3.12가 잡힐 수도 있어요. 같은 코드인데 환경마다 다르게 동작하면 디버깅 지옥이 열립니다.
import sys
# 사람이 읽기 좋은 형태
print(sys.version)
# 3.12.1 (main, Dec 8 2023, 18:20:22) [Clang 15.0.0 ...]
# 코드로 분기할 때 쓰기 좋은 형태
print(sys.version_info)
# sys.version_info(major=3, minor=12, micro=1, releaselevel='final', serial=0)
# 버전별 분기가 필요할 때
if sys.version_info >= (3, 10):
# match 문 사용
...
else:
raise RuntimeError("Python 3.10 이상이 필요합니다")
sys.version은 문자열이라 로깅이나 디버깅에 좋고, sys.version_info는 네임드 튜플이라 >= 비교가 바로 됩니다. 중요한 건 "내 컴퓨터에 뭐가 깔려 있지"가 아니라 "지금 이 프로세스가 무슨 버전으로 실행되고 있지"를 확인하는 것입니다. 커맨드라인에서는 python --version 대신 python -c "import sys; print(sys.version)"로 확인하는 습관이 더 정확합니다.
python 명령어가 어떤 버전을 가리키는지는 환경마다 다르니 sys.version_info로 프로세스 내부에서 직접 확인하세요.sys.version_info >= (3, X) 체크로 명시적으로 최소 버전을 선언하면 좋습니다.pyproject.toml의 requires-python에도 최소 버전을 박아두면 설치 단계에서 걸러집니다.CI 파이프라인 스크립트 맨 위에 assert sys.version_info >= (3, 11), "Python 3.11+ required" 한 줄 넣어두면, 나중에 팀원이 구버전 로컬에서 돌리다 엉뚱한 에러로 시간 낭비하는 걸 막을 수 있습니다. 또 Docker 이미지를 만들 때 FROM python:3.12-slim처럼 태그를 고정해두고, 컨테이너 시작 시점에 버전을 로그로 찍어두면 "어제까지 되던 게 왜 안 되지?" 디버깅이 훨씬 빨라집니다.