TIL 12 | Python modules, packages and path
import modules and packages
python에서 모듈과 패키지를 import할 때, 파이썬이 이들을 검색하는 순서가 있다.
sys.modules -> built-in modules -> sys.path
- sys.modules
파이썬이 모듈이나 패키지를 찾기 위해 가장 먼저 확인하는 곳으로 dictionary 구조이다. 이미 import된 모듈이나 패키지를 저장하고 있다.
아래는 터미널에서 sys.modules를 실행시킨 모습이다.>>> sys.modules {'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, (이하 생락) }
- built-in modules
파이썬에서 제공하는 공식 라이브러리들이다. 빌트인 모듈은 이미 파이썬에서 포함되어 나와 쉽게 찾을 수 있고, 별도의 설치 과정 없이 바로 사용할 수 있다. - sys.path
sys.path는 string 요소를 가진 List이다. 각각의 string 요소는 경로를 나타낸다. 파이썬은 List를 하나씩 확인하면서 해당 경로에 import 하고자 하는 패키지가 있는지 확인한다.
마찬가지로 sys.path 실행시킨 모습이다.
sys.path에서도 모듈이나 패키지를 찾지 못하면 ModuleNotFoundError를 반환한다.>>> sys.path ['', '/home/sehyeong/miniconda3/lib/python38.zip', '/home/sehyeong/miniconda3/lib/python3.8', '/home/sehyeong/miniconda3/lib/python3.8/lib-dynload', '/home/sehyeong/miniconda3/lib/python3.8/site-packages']
sys.modules 와 sys.path의 차이점
제일 먼저 보이는 점으론 둘의 자료형이다. sys.modules는 dictionary, sys.path는 list를 반환한다.
출력값의 길이를 비교해보면,
>>> len(sys.modules)
38
>>> len(sys.path)
5
와 같다. sys.modules가 훨씬 많은 데이터를 반환하고 있다. 이유는 sys.modules는 설치된 모듈과 패키지를, sys.path는 모듈과 패키지가 설치된 디렉토리를 출력하기 때문이다.
sys
sys.modules나 sys.path를 출력할 때, 그냥 입력한다고 출력되진 않는다. sys도 import 해줘야 한다.
sys 모듈은 일단 파이썬 인터프리터와 관련된 정보와 기능을 제공하는 모듈이다. import 해서 사용하니 sys.py 와 같은 파일이 있나 싶었지만, sys.modules 출력값을 보면 그렇지도 않다.
>>> sys.modules
{'sys': <module 'sys' (built-in)>, ... }
출력값에 보면 built-in 으로, 빌트인 모듈임을 알 수 있다. sys는 C언어로 프로그래밍되어 파이썬에 내장되어 있고, built-in modules에서 가져오는 것이다!
Absolute Path, Relative Path
모듈이나 패키지를 import 해올 때, 경로를 적어줘야 한다.
예를 들어, 다음과 같은 파일이 있다.
my_app이라는 프로젝트는 여러 패키지와 모듈로 구성돼 있다.
module4.py를 가져올 땐.
from package1 import module4
subpackage1 디렉토리 안에 있는 module5.py를 가져올 땐,
from package2.subpackage1 import module5
와 같이 입력해줘야 한다.
이와 같은 경로를 Abosulte Path, 절대경로라고 한다. my_app 프로젝트 내에서는 어느 파일, 어느 위치에서 import 하던지 경로가 항상 위와 같이 동일하게 되므로 absolute path 라고 하는 것이다. Relative Path는 현재 디렉토리를 기준으로 입력하는 경로로, 절대경로보다 비교적 간단하게 쓸 수 있지만, 현재위치에 따라 경로값을 계속 수정해줘야 하므로 절대경로를 쓰는 것이 권장된다.
Relative Path는 다음과 같다.
package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import하려고 하면 다음 처럼 할 수 있다.
# package2/module3.py
from . import class1
from .subpackage1.module5 import function2
여기서 dot(.)은 import가 선언되는 파일의 현재 위치이다. 현재위치는 package2/module3.py 이므로 현재 위치에서부터 원하는 모듈의 경로만 선언해주면 된다. 또한 dot 2개를 사용할 수도 있는데, dot 2개(..) 는 현재위치에서 상위 디렉토리로 가는 경로이다.
Author And Source
이 문제에 관하여(TIL 12 | Python modules, packages and path), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sehy/python-s0ul1zvi저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)