파이썬에서 모듈은 변수나 함수 그리고 클래스 등을 모아놓은 파일입니다.
따로 모듈로 모아놓은 이유는 다음과 같습니다.
아래와 같은 모듈(my_module.py 이름의 파일)이 있다고 하자.
# my_module.py def basic(): return "Hello!"
이 모듈을 사용하기 위해서는 import가 필요합니다.
import my_modile basic()
-> "Hello!"
실제로 해당 함수를 정의하지 않았지만 모듈에서 정의된 함수를 가져와서 사용하는 모습이다.
모듈을 import할때 파이썬 내부 과정은 어떠할까?
파이썬은 다음 3가지 장소를 순서대로 보면서 찾는다.
1. sys.modules
2. built-in modules
3. sys.path
파이썬이 모듈을 찾기위해 가장 먼저 확인하는 곳입니다.
sys.modules는 단순한 dictionary 이고 그리고 이미 import된 모듈과 package들을 저장하고 있습니다. 즉, 한번 import된 모듈은 파이썬이 또 다시 찾지 않아도 되도록 하는 기능을 가지고 있습니다. 그러므로 새로 import 하는 모듈은 sys.modules 에서 찾을 수 없습니다.
파이썬에서 제공하는 파이썬 공식 라이브러리들 입니다.
Built-in 모듈들은 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있습니다.
마지막으로 보는 장소가 바로 sys.path 입니다.
sys.path는 기본적으로 list이며 string 요소들을 가지고 있는 list 입니다. 각 string 요소들은 파이썬 라이브러리가 설치되어 있는 디렉터리를 보여 줍니다. 만약 파이썬 모듈이 위 디렉터리에 들어 있다면 모듈이 저장된 디렉터리로 이동할 필요 없이 바로 불러서 사용할 수 있습니다. 또는 sys.path.append(경로)를 사용하여 직접 경로를 추가해서 사용할 수도 있습니다.
우선 파이썬이 모듈을 찾기위해 찾는 순서가 다르고 형식 또한 다릅니다. dictionary 형태를 하고 있는 sys.module의 경우 이미 import된 경로만을 추가해두는 방면 list 형태의 sys.path는 바로 불러서 사용할 수 있습니다.
답을 알기위해서 sys.modules의 내용물을 봐볼 필요가 있다.
import sys for key in sys.modules.keys(): print(key)
위의 코드를 실행시켜 sys.modules 의 키들을 확인해보자.
copy_reg sre_compile _sre ... sys ... exceptions sre_parse os _weakref
중간에 딕셔너리 key값으로 sys가 있는것을 알 수 있다. 키를 이용해 값을 찾아보자.
print(sys.modules['sys'])
-> <module 'sys' (built-in)>
즉 import sys를 하게되면 순서상 있는 sys.modules 내에 있는 경로를 확인하는데 그 중 sys의 경로가 있으며 경로상으로 이미 내장되어있다는걸 알 수 있다.
└── deonii ├── main.py ├── package1 │ ├── module1.py │ └── module2.py └── package2 ├── __init__.py ├── module3.py └── subpackage1 └── module4.py
이런 경로로 패키지와 모듈을 운용하고 있다고 해보자.
이때 내가 필요한 모듈을 사용하기 위한 방법은 Absolute Path(절대 경로) & Relative Path(상대 경로)로 두가지이다.
만약 내가 package2 안에 subpackage1안에 module4안에 함수 function2를 import하고싶다고 가정하자. 이때 절대 경로로 표현하면
from package2.subpackage1.module4 import function2
처럼 경로를 전부 작성해 주어야한다.
만약 module3에서 module4의 파일을 import한다 가정했을때 상대 경로는
from .subpackage1 import module4
처럼 경로의 앞부분(package2.)을 . 으로 생략할 수 있다.