프로젝트 작업중에 패키지를 자체 제작하여 쓸 때가 있습니다. 기본적으로 상대 경로를 지정해서 import해오는 방법을 쓰지만 상위 폴더 접근 제한 문제로 이 방법을 쓸 수 없을 때가 있습니다. 먼저 python에서 기본적으로 패키지를 검색해 오는 과정을 살펴보고 경로를 추가하는 법을 알아보겠습니다.
일부는 인터프리터에 포함됩니다. sys가 대표적인 그 예입니다.
import 과정이 진행되면 가장 먼저 여기에서 모듈을 찾습니다. 이 모듈은 지금까지 import해온 모듈들의 캐시입니다.
쓰기 가능한 딕셔너리이며 키를 삭제해도 참조는 유지되기 때문에 기존에 import해온 것들은 정상 작동합니다. 다만 새로 해당 모듈을 import하는 경우 새로 import해 오게 됩니다.
캐시되지 않아 새로 불러와야 한다면 finder가 작동합니다. finder는 첫 번째로 built-in 모듈, 두 번째로 frozen 모듈(바이트코드 컴파일된 모듈), 세 번째로 지정된 import 경로에서 찾아오는 것이 순차적으로 실행됩니다. 공식 문서에서는 이 finder를 추가해서 검색 경로를 추가하는 것이 가능하다고 나와 있지만 지나치게 어려워 보이고(..) 다른 간편한 방법이 있기에 이 글에서는 다루지 않겠습니다.
위에서 언급한 마지막 finder가 찾아오는 경로가 sys.path입니다. 이 경로에서 마지막으로 모듈을 찾고 여기에서도 찾을 수 없다면 ModuleNotFoundError를 일으키게 됩니다. 여기에 경로를 추가함으로서 검색 경로를 추가할 수 있습니다.
sys.path.append({경로})
이 코드를 삽입하여 간단하게 해당 경로의 파일도 검색하도록 할 수 있습니다. 그러나 해당 모듈을 사용하는 모든 파일에서 import 전에 추가해야 하기 때문에 코드가 다소 난잡해 보일 수 있는 문제가 있습니다.
파이썬 경로의 .../site-packages 디렉토리에 pth 파일을 추가함으로서 검색 경로를 추가할 수 있습니다. pth 파일의 한 줄 한 줄이 sys.path에 추가됩니다. 파이썬 전역으로 추가되기 때문에 필요한 가상환경에서만 추가하는 것을 권장합니다.
환경 변수 PYTHONPATH에 경로를 추가하여 검색 경로를 추가할 수 있습니다. 2-2와 같은 이유로 필요한 가상환경에서만 추가하는 것을 권장합니다.
https://docs.python.org/3/reference/import.html#searching
https://docs.python.org/3/install/index.html#modifying-python-s-search-path
https://wiki.python.org/moin/Freeze