[Python] Module Search Path and sys.path

2023. 6. 18. 22:13·Programming
728x90
728x90

Module Search Path and sys.path

1. Module Search Path

Python 에서 module을 찾는 경로 (Module Search Path)는 다음의 순서별로 우선권을 가짐.

  1. 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 모듈을 지정하여 수행한 경우.
  2. PYTHONPATH 환경변수 (environment variable)에 지정된 directory 및 zip파일.
  3.  Python Standard Library directories
  4. .pth (path config file)에 기재된 path
  5. 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/

 

BME

Modules and Packages Module 쉽게 생각하면 Python code 로 구성된 file .py자체를 가리킨다. Module은 import될 때 각각 고유의 namespace를 가지므로, Module은 일종의 Namespace이기도 함. Python에서 module은 확장자가 .p

dsaint31.me


2. Module (or package) 검색 관련 object.

module 검색과 관련된 object는 다음의 두가지 있음.

  1. sys.modules : import가 된 모듈 및 package들이 저장되어 있는 dict임.
  2. 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 파일의 path를 python interpreter에게 넘겨주어 수행시키는 방식에서
    home은 main script가 놓인 directory임.
  • python interactive shell을 수행한 REPL 인 경우,
    또는 -m 옵션으로 실행시킨 경우,
    python 수행을 시킨 path (=current working directory)가 home임.

3.2. PYTHONPATH 환경변수란? ***

환경변수로 사용자나 system 의존적인 경로 등을 추가할 수 있음.

  • windows에서는 seperator가 ; (semicolon)임.
  • linux에서는 seperator가 : (colon)임.

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라고도 지칭함.

이들을 배치하는 것을 절대 경로 와 상대 경로 방식으로 나타낼 수 있음.

 

상대경로와 절대경로 참고 자료 : 2021.10.17 - [Computer/ETC] - Path (경로)

 

Path (경로)

파일 시스템 내에서 특정 파일(혹은 디렉토리)의 위치를 나타내는 문자열Absolute Path (절대 경로)현 작업디렉토리(cwd)와 관계없이 절대적 위치드라이브:\폴더\폴더\파일명 (Windows)c:\Windows\System32\dri

dsaint31.tistory.com


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파일 (=모듈)의 __name__ 을 기준으로
상대경로로 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

 

[Python] Ex: Relative Path Import 시 주의할 점

다음은 main script 등에서 relative path import를 사용할 때,__name__을 기준으로 삼기 때문에 주의해야 점을 발생 가능한 문제를 예를 들어서 설명하는 문서임. 참고: 패키지 컨텍스트(package context)Python

ds31x.tistory.com


5. 좀 더 읽어볼 자료.

2022.07.18 - [Programming] - [Python] 현재 사용 중인 Python 및 패키지의 실제 경로 확인하기.

 

[Python] 현재 사용 중인 Python 및 패키지의 실제 경로 확인하기.

Linux, macOSwhich python실행되는 Python의 경로를 보여줌.Windowswhere python실행되는 Python의 경로를 보여줌.Python shell (패키지 및 python library위치)# 사용중인 python 경로import sysprint(sys.executable)# python library fr

dsaint31.tistory.com

 

https://dsaint31.me/mkdocs_site/OS/path/#path

 

BME228

Path (경로) 파일 시스템 내에서 특정 파일(혹은 디렉토리)의 위치를 나타내는 양식 Absolute Path (절대 경로) 현 작업디렉토리(cwd)와 관계없이 절대적 위치 드라이브:\폴더\폴더\파일명 (windows) c:\Windo

dsaint31.me

 

https://ds31x.tistory.com/4

 

[Env] Environment Variable (환경변수)

정의 Environment variable (환경변수) 란, OS나 SW에서 참조하는 변수들로 OS나 SW가 동작 (or 실행)에 영향을 주는 값을 가짐. shell script 나 software들이 각 장비의 환경에 맞게 동작할 수 있도록 해 줌. 종

ds31x.tistory.com

 

 


 

'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
'Programming' 카테고리의 다른 글
  • [Python] f-String
  • [Python] Assignment (Basic)
  • [Python] importlib.reload : module 재적재
  • [Python] Exception 처리
dsaint31x
dsaint31x
    반응형
    250x250
  • dsaint31x
    Dsaint31's blog
    dsaint31x
  • 전체
    오늘
    어제
    • 분류 전체보기 (752)
      • Private Life (13)
      • Programming (56)
        • DIP (112)
        • ML (26)
      • Computer (119)
        • CE (53)
        • ETC (33)
        • CUDA (3)
        • Blog, Markdown, Latex (4)
        • Linux (9)
      • ... (355)
        • Signals and Systems (107)
        • Math (172)
        • Linear Algebra (33)
        • Physics (42)
        • 인성세미나 (1)
      • 정리필요. (54)
        • 의료기기의 이해 (6)
        • PET, MRI and so on. (1)
        • PET Study 2009 (1)
        • 방사선 장해방호 (4)
        • 방사선 생물학 (3)
        • 방사선 계측 (9)
        • 기타 방사능관련 (3)
        • 고시 (9)
        • 정리 (18)
      • RI (0)
      • 원자력,방사능 관련법 (2)
  • 블로그 메뉴

    • Math
    • Programming
    • SS
    • DIP
  • 링크

    • Convex Optimization For All
  • 공지사항

    • Test
    • PET Study 2009
    • 기타 방사능관련.
  • 인기 글

  • 태그

    DIP
    math
    function
    signals_and_systems
    Python
    fourier transform
    Convolution
    linear algebra
    SIGNAL
    Optimization
    Programming
    인허가제도
    numpy
    Probability
    SS
    cv2
    Vector
    opencv
    Term
    signal_and_system
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dsaint31x
[Python] Module Search Path and sys.path
상단으로

티스토리툴바