Python import 검색 경로 추가하기

maintain·2020년 8월 26일
1

프로젝트 작업중에 패키지를 자체 제작하여 쓸 때가 있습니다. 기본적으로 상대 경로를 지정해서 import해오는 방법을 쓰지만 상위 폴더 접근 제한 문제로 이 방법을 쓸 수 없을 때가 있습니다. 먼저 python에서 기본적으로 패키지를 검색해 오는 과정을 살펴보고 경로를 추가하는 법을 알아보겠습니다.

1. 패키지 검색 순서

1-0. 인터프리터 포함

일부는 인터프리터에 포함됩니다. sys가 대표적인 그 예입니다.

1-1. sys.modules

import 과정이 진행되면 가장 먼저 여기에서 모듈을 찾습니다. 이 모듈은 지금까지 import해온 모듈들의 캐시입니다.
쓰기 가능한 딕셔너리이며 키를 삭제해도 참조는 유지되기 때문에 기존에 import해온 것들은 정상 작동합니다. 다만 새로 해당 모듈을 import하는 경우 새로 import해 오게 됩니다.

1-2. finder

캐시되지 않아 새로 불러와야 한다면 finder가 작동합니다. finder는 첫 번째로 built-in 모듈, 두 번째로 frozen 모듈(바이트코드 컴파일된 모듈), 세 번째로 지정된 import 경로에서 찾아오는 것이 순차적으로 실행됩니다. 공식 문서에서는 이 finder를 추가해서 검색 경로를 추가하는 것이 가능하다고 나와 있지만 지나치게 어려워 보이고(..) 다른 간편한 방법이 있기에 이 글에서는 다루지 않겠습니다.

1-3. sys.path

위에서 언급한 마지막 finder가 찾아오는 경로가 sys.path입니다. 이 경로에서 마지막으로 모듈을 찾고 여기에서도 찾을 수 없다면 ModuleNotFoundError를 일으키게 됩니다. 여기에 경로를 추가함으로서 검색 경로를 추가할 수 있습니다.

2. 특정한 경로 추가하기

2-1. 동적 sys.path 수정

sys.path.append({경로})

이 코드를 삽입하여 간단하게 해당 경로의 파일도 검색하도록 할 수 있습니다. 그러나 해당 모듈을 사용하는 모든 파일에서 import 전에 추가해야 하기 때문에 코드가 다소 난잡해 보일 수 있는 문제가 있습니다.

2-2. pth 파일 추가하기

파이썬 경로의 .../site-packages 디렉토리에 pth 파일을 추가함으로서 검색 경로를 추가할 수 있습니다. pth 파일의 한 줄 한 줄이 sys.path에 추가됩니다. 파이썬 전역으로 추가되기 때문에 필요한 가상환경에서만 추가하는 것을 권장합니다.

2-3. PYTHONPATH 추가하기

환경 변수 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

0개의 댓글