0.
파이썬의 임포트에 대해서 알아보자.
import_example이라는 폴더 안에 mymodule.py와 code.py를 작성해준다.
mymodule.py에서 함수를 정의하고, code.py에서 함수를 임포트해서 사용해보자.
# mymodule.py
def divide(dividend, divisor):
return dividend / divisor
print("mymodule.py: ", __name__)
# output : mymodule.py: __main__
print("mymodule.py:", __name__)에서
__name__은 파이썬에서 사용되는 전역변수GlobalVariable이자 특수변수SpecialVariable이다.
실행되는 파일의 이름을 나타내어, 실행하는 파일과 임포트하는 파일을 구분하는 기능을 제공한다.
또 다른 기능들도 있는데, 그건 나중에 알아보자.
하여튼, mymodule.py를 실행하면
mymodule.py: __main__ 이 출력된다.
1.
이제 code.py에서 아래와 같은 코드를 수행해보자.
# code.py
from mymodule import divide
print(divide(10, 2))
# mymodule.py: mymodule
# 5.0
print(__name__)
# __main__
mymodule에서 divide함수를 import해온뒤,
print(divide(10,2))를 수행한다.
5.0이라는 결과가 나온건 당연한것이고
print("mymodule.py:", __name__) 를 수행하면서.
mymodule.py: mymodule이라는 결과가 출력되었다는 점이 중요하다.
그리고 code.py에서 __name__을 출력했더니, __main__이 출력되었음도 확인할 수 있다.
2.
파이썬은 임포트하려는 module의 위치를 어떻게 알까?
sys 모듈을 통해서 파이썬이 인식하는 모듈의 위치를 알 수 있다.
mymodule.py에 아래와 같은 코드를 수행해보자.
import sys
print(sys.path)
['c:\\...\\import_example', 'C:\\Users\\...\\Python39\\python39.zip', 'C:\\Users\\...\\AppData\\Local\\Programs\\Python\\Python39\\DLLs', 'C:\\Users\\...\\AppData\\Local\\Programs\\Python\\Python39\\lib', 'C:\\Users\\...\\AppData\\Local\\Programs\\Python\\Python39', 'C:\\Users\\...\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages']
sys.path를 프린트해보면, 여러가지 Path가 담긴 리스트를 확인할 수 있다.
파이썬은 sys모듈을 임포트하기 위하여 리스트의 앞Path부터 확인한다.
c:\\...\\import_example, 즉 mymodule.py가 담긴 폴더부터 확인한다.
여기에 sys모듈이 없다면,
리스트의 그다음 원소의 'C:\\Users\\...\\Python39\\python39.zip'를 검사하고,
여기에도 sys모듈이 없다면, 그 다음 Path를 확인하는 식으로
마지막 Path까지 확인하여 모듈을 찾아낸다.
그리고 모듈이 발견되면, 그 모듈의 Path가 결정되고 거기서 import를 하며
끝까지 모듈이 발견되지 않으면, import error를 발생시킨다.
처음Path는 항상 실행되는 파일이 있는 디렉토리가 되며,
두번째Path부터 나머지까지는 파이썬 환경변수의 PATH 목록이다.
파이썬 설치할때 건드리는 환경변수 그거 맞다.
3.
sys.modules를 수행해보면,
해당파일에 임포트된
모든 빌트인 모듈과 임포트한 모듈들을 확인할 수 있다.
import sys
print(sys.modules)
4.
여러가지 PATH가 있는 이유는 임포트를 한번만 하기 위해서이다.
우리가 파일을 임포트할때, 모듈들이 파일에 의해 실행된다.
파이썬은 임포트된 파일을 계속 트래킹해서, 이미 실행된 모듈을 또다시 임포트하는 불상사가
발생하지 않도록 하는 역할을 한다.
그래서 우선순위가 담긴 PATH들을 통해서 한번만 모듈을 임포트하고,
이미 임포트했으면 어디에서 임포트된건지 확인하는 방법을
sys모듈을 통해서 알아보았다.
5.
앞서 배운 임포트가 Absolute Import라면,
해당 모듈의 위치를 기준으로 임포트하는 Relative Import도 존재한다.
이걸 배우는 이유는... 얘를 웬만해서는 쓰지말라는 뜻에서 배운다.
from .module_name import function_name # 현재 디렉토리
from ..module_name import function_name # 부모 디렉토리
from ...module_name import function_name # 상위 부모 디렉토리
relative import는 코드를 어렵게 만들 수 있어서 사용하지 않는게 좋다.
(300이하 맛세이 금지.. 그런느낌이다)
import 키워드를 사용할 때, 모듈 경로를 상대적으로 지정하는 방식인데
우리가 사용했던 방식이 절대적 임포트Absolute Import, 절대 경로를 사용해서 모듈을 임포트했던 방식이라면
Relative Import, 상대적 임포트는
현재 모듈의 위치 기준으로 다른 모듈을 임포트하는 방법이다.
import .module_name 이라고하면, 현재 디렉토리에,
import ..module_name 이라고하면, 부모 디렉토리에 있는 모듈을 임포트한다.
project/
│
├── package/
│ ├── __init__.py
│ ├── module_a.py
│ ├── module_b.py
│ └── subpackage/
│ ├── __init__.py
│ ├── module_c.py
│ └── module_d.py
위와 같은 프로젝트의 디렉토리가 있다고 하자.
module_a.py에서 module_b를 relative import한다면
from .module_b import some_function 하면되고
module_c.py에서 module_b를 임포트하려면
from ..module_b import some_function을 하면된다.
'지식이 늘었다 > 웹개발' 카테고리의 다른 글
FastAPI 기초 (1) GET과 Path Parameter (1) | 2024.12.18 |
---|---|
FastAPI 개발환경 세팅 (0) | 2024.12.17 |
Python 문법 Type Hinting (0) | 2024.12.17 |
Python의 @classmethod, @staticmethod, 데코레이터 @ (0) | 2024.12.17 |
Python의 Magic Method - __repr__()와 __str__() (1) | 2024.12.16 |