파이썬에서 모듈을 가져올 때, 인터프리터는 sys.path에 나열된 디렉토리에서 모듈을 찾습니다. 먼저 표준 모듈 중에서 찾고, 그 다음에 .py, .pyc 파일 및 __init__.py 파일이 있는 디렉토리(패키지)에서 찾습니다.
sys.modules에서 모듈을 가져옵니다.ModuleNotFoundError 예외가 발생합니다..pyc)로 변환되고 캐싱됩니다(쓰기 권한이 있는 경우).# mypkg/__init__.py (비어 있을 수 있음) # mypkg/mod.py # main.py import mypkg.mod
__init__.py의 유무(파이썬 <3.3 필수) — 모두 중요합니다.sys.path의 디렉토리에서 찾기(현재 스크립트의 디렉토리가 항상 첫 번째).from . import ..., 절대/상대 가져오기).스크립트가 있는 디렉토리에
random.py라는 이름의 파일이 있으면, 표준 모듈random을 가져오려고 할 때 무슨 일이 벌어질까요?
내 로컬 파일 random.py가 가져와지고, 표준 라이브러리는 가져오지 않습니다. 이름 충돌로 인한 문제는 발견하기 어려운 버그의 일반적인 원인입니다. 파일 이름 지정에 주의해야 합니다.
이야기
대규모 프로젝트에서 email.py 모듈이 라이브러리의 표준 모듈 email을 우연히 가리켜, 개발자들은 오랫동안 외부 라이브러리의 이메일 구문 분석 함수가 왜 작동하지 않는지 파악하지 못했습니다.
이야기
ML 프로젝트에서 os.path 함수가 작동하지 않았습니다: 주요 스크립트와 옆에 있는 os.py 파일이 표준 모듈에 대한 모든 호출을 가로챘습니다. 이름 충돌을 발견하기까지 한 달 동안 디버깅에 시간을 소비했습니다.
이야기
마이크로서비스 REST API에서 여러 하위 패키지 간의 모델에 대한 상대적 가져오기 시도 중에 순환 가져오기가 발생했습니다. 모듈 로딩 순서를 명확히 하기 위해 프로젝트 구조를 리팩토링한 후에만 문제를 해결했습니다.