Module Search Path and sys.path
1. Module Search Path
Python 에서 module을 찾는 경로 (Module Search Path)는 다음의 순서별로 우선권을 가짐.
home
directory of the program (main script file이 있는 위치 or python shell이 수행된 cwd)- main script file이 있는 위치: main script인 python파일의 path를 인자로 넘겨 수행한 경우.
- python shell이 수행된 cwd: -m 옵션으로 main script 모듈을 지정하여 수행한 경우.
PYTHONPATH
환경변수 (environment variable)에 지정된 directory 및 zip파일.- Python Standard Library directories
.pth
(path config file)에 기재된 path- Third-party 라이브러리들의
site-packages
디렉토리.
참고로 3번, 4번과 5번의 경우는 개발자가 주로 설정하진 않는 편.
.pth
파일을 사용하는 경우도 있긴 하지만PYTHONPATH
보단 많이 사용되지 않는 편임.
해당 순서에 따라 sys
모듈의 path
list에 Python에서 module를 검색하는 경로들이 저장됨.
주의할 것은 순서가 빠른 곳에서 찾는 name에 해당하는 module이 있으면 우선적으로 해당 module이 import됨.
(즉 앞에 놓인 곳의 module들에 우선순위가 있음)
Python에서의 module의 개념이 헷갈리면 다음 URL을 참고
https://dsaint31.me/mkdocs_site/python/basic/module_package/
2. Module (or package) 검색 관련 object.
module 검색과 관련된 object는 다음의 두가지 있음.
sys.modules
: import가 된 모듈 및 package들이 저장되어 있는 dict임.sys.path
: Module Search Path에 있던 경로들이 모두 저장된 list임.
sys.modules
는 이미 import가 된 것들이 저장된 dictionary
이고, sys.path
는 새로 import되는 경우 찾아지게 되는 path들이 저장된 list
임.
sys.modules
와sys.path
모두
Python code로 접근 및 수정이 가능함.
sys.path
의 간단한 예 (mamba
를 사용하여 virtual env intro
를 만들고 확인).
Python 3.11.4 | packaged by conda-forge | (main, Jun 10 2023, 18:08:17) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/home/ddsaint31', '/home/dsaint31/mambaforge/envs/intro/lib/python311.zip',
'/home/dsaint31/mambaforge/envs/intro/lib/python3.11',
'/home/dsaint31/mambaforge/envs/intro/lib/python3.11/lib-dynload',
'/home/dsaint31/mambaforge/envs/intro/lib/python3.11/site-packages']
>>>
3. Module Search Path 각각에 대한 설명
3.1. Moduel Search Path에서 home
이란?
- main script 파일을 python interpreter에게 넘겨주어 수행시키는 방식에서
home
은 main script가 놓인 directory임. - python interactive shell을 수행한 REPL 인 경우,
또는 -m 옵션으로 실행시킨 경우,
python 수행을 시킨 path (=current working directory)가home
임.
3.2. PYTHONPATH
환경변수란?
환경변수로 사용자나 system 의존적인 경로 등을 추가할 수 있음.
- windows에서는 seperator가
;
임. - linux에서는 seperator가
:
임.
executable file을 찾는 경로들이 저장된
PATH
환경변수와 같은 방식으로 지정됨.
linux의 bash에서는
export PYTHONPATH="/home/dsaint31/test0:/home/dsaint31/test1"
으로 환경변수를 설정함.
3.3. Python Standard Libary들의 위치
lib/python3XX.zip
, lib/python3.XX
, lib/python3.XX/lib-dynload
등등.
3.4. .pth
파일을 통한 path추가.
Python이 install 된 directory ( c:\Python36
이나 /usr/local/lib/python3.6/site-packages
등) 의
top level위치에 myconfig.pth
와 같은 path config file을 통해 설정 추가 가능함.
해당 파일에 하나의 line에 module을 찾을 디렉토리등이 놓이게 됨.
위의 설명은 매우 간단히 소개만 한 것으로
실제 사용하려면 Python library manual을 자세히 봐야 한다.
개인적으로는sys.path
를 수정하거나PYTHONPATH
를 편집하는 것을 선호함.
3.5. Lib/site-packages
디렉토리 (third-party library)
conda
나 pip
등을 통해 설치된
third-party library들의 site-packages
에서
마지막으로 module 검색이 이루어짐.
sys.path
list에서도 뒷부분에 놓여있음 (낮은 우선순위).
4. Absolute Path and Relative Path
package들은 일종의 subdirectory로
package들을 이용하여 계층적인 구조를 만들어낼 수 있음
(모듈간의 논리적인 관계에 기반하여 계층구조를 만들 수 있음).
package를 통해 namespace를 각기 가지므로
이같이 중간에 추가되는 package들을 namespace package라고도 지칭함.
이들을 배치하는 것을 절대 경로 와 상대 경로 방식으로 나타낼 수 있음.
상대경로와 절대경로 참고 자료 : https://dsaint31.me/mkdocs_site/OS/path/#path
4.1. Absolute Path
Module Search Path에 위치한 경로들 중 sys.path
에서 /home/dsaint31/test
디렉토리가 있다고 가정하자.
import pacakge0.package1.module0
로 import를 하는 경우, module0.py
의 위치는 다음과 같음.
/home/dsaint31/test/package0/package1/module0.py
absoulte path의 경우, 일반 path 를 나타낼 때 /
와 같은 delimiter 대신 .
을 사용하여 import한다고 생각하면 됨.
단점은 import문에서 상당히 긴 경로를 기재하게 된다는 것임.
4.2. Relative Path
import
statement를 가지고 있는 .py
파일 (=모듈)을 기준으로
상대경로로 import를 하는 것이 Python 3에서 도입됨.
package0/module0.py
에서 다음의 import
statement가 있다고 가정하자.
# package0/module0.py
from . import moduel1
이 경우module1.py
의 위치는 package0/module1.py
로,
기준이 되는 module0.py
와 같은 디렉토리에 있음.
.
(같은 디렉토리) 과 ..
(상위 디렉토리)를 사용하여 import
를 하는 것이 바로 relative path임.
실제로는
__name__
을 기준으로 path를 찾기 때문에
main script로 실행되는 경우 대부분 문제가 생김.
(__main__
이 되기 때문.)
때문에 상대경로를 사용하는 main script가 package내에 있다면,python -m package_name.module_name
으로 수행해야함.
개인적으로 relative path는 가독성이 꽤 떨어지고 직관적이지 않아 import에선 선호하지 않는다.
좀더 자세한 건 여기를 참고할 것: https://ds31x.tistory.com/317
5. 좀더 읽어볼 자료.
2022.07.18 - [Programming] - [Python] 현재 사용 중인 Python 및 패키지의 실제 경로 확인하기.
https://dsaint31.me/mkdocs_site/OS/path/#path
'Programming' 카테고리의 다른 글
[Python] f-String (1) | 2023.06.21 |
---|---|
[Python] Assignment (Basic) (0) | 2023.06.20 |
[Python] importlib.reload : module 재적재 (0) | 2023.06.18 |
[Python] Exception 처리 (0) | 2023.06.16 |
[Python] Strong Typing이란? with Object (1) | 2023.06.13 |