TIL #6 How Import Statement Finds Modules & Packages

ahn__jh·2021년 3월 24일
0

1-1. sys.modules

한번 import로 호출된 module과 package는들 dictionary 형태로 가지고있음
한번도 import로 호출되지 않았던 module과 package는 sys.modules에 존재하지 않는다.

1-2. sys.path

list이며, 문자열 형태로 경로를 리스트 요소로 갖고있음 python은 경로를 하나하나 확인하며 import할 package가 있는지 확인한다.

1-3. built-in modules

python이 기본으로 제공하는 module로 python이 쉽게 찾을 수 있다.


*sys는 python에 포함되어 있는 module 임.
출력을 확인 해볼 수 있음

import sys

print(sys.path)
print(sys.modules)

2.import search 순서

예를 들어 jha 라는 module 혹은 package를 import 할 때 python이 찾는 순서는

import jha
  1. sys.modules에서 불러온적이 있다면 sys.modules 에서 찾고 없다면
  2. built-in modules python에 내장된 라이브러리에서 찾고
  3. sys.path 마지막으로 sys.path에서 module혹은 package를 리스트에 저장된 경로를 하나 하나 확인 하며 찾는다.

3.Absolute Path & Relative Path

3-1. Absolute Path

built-in moduel, pip를 통해 설치한 외부 package는 site-packages로 자동 저장되며, site-packages는 sys.path에 포함 되어있어 import로 호출시 크게 문제 없으며 문제는
직접개발한 local package인데 이를 import할때는 경로를 정확하게 호출해야한다.

my_app 이라는 프로젝트를 예로 들면

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py

위 패키지에서 module5.py 라는 module을 호출하려면 경로는 이렇게 된다.

my_app > package2 > subpackage1 > module5



python 방식으로 표현하면 .(dot)로 디렉토리를 구분한다
my_app 디렉토리 아래 package2 아래 subpackage1 아래 module5 안의 클래스

my_app.package2.subpackage1.module5

이렇게 경로를 확인해서 직접 호출하는 것을 절대경로 라고 하는데 이를 Absolute Path 라고 한다.



from package2.subpackage1.module5 import Func(module 내 클래스)

from import로 호출 하게되면

현재 my_app이라는 프로젝트 안에 있다면 package2 라는 디렉토리 밑에 subpackage1 디렉토리 밑에 module5 내 함수를 호출 하겠다고 하는 것 이다.


Relative Path는 현재 위치에서 import 하는 기준으로 상대적경로 라고 한다.

3-2. Relaitve Path

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py


package2 안의 module3에서 module5내의 함수를 import 하려면 아래처럼 할수있다.

from .subpackage1.module5 import function2

module5는 subpackage1안에 있는데 subpackage1은 module3와 같은 디렉토리에 있기 때문에 상위디렉토리는 안내할 필요없이 .(dot) 으로 현재위치를 안내하고 subpackage1 밑 module5안의 fuction2 함수를 호출 하는것이다.

*.(dot)는 파일의 현재 위치를 안내한다


반대로 하위 module5에서 상위 디렉토리에 있는 module4내의 func5를 호출 할때는

from ..module4 import func5

.. 은 상위 디렉토리를 말하며 상위 module4에서 func5 함수를 호출한다는 코드이다.


Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있다. 웬만한 경우 absolute path를 사용하는게 권장

0개의 댓글