## 1.
sys.modules
와 sys.path
의 차이점
파이썬이 모듈, 패키지를 찾기위해 가장 먼저 확인하는 곳으로 단순한 dictionary이다. 이미 import 된 모듈과 패키지를 저장한다. (한번 import된 모듈과 패키지는 파이썬이 다시 찾지 않게 한다.) 새로 import 하는 모듈은 sys.modules에서 찾을 수 없다.
파이썬이 모듈, 패키지를 찾을 때 마지막으로 보는 장소이다. 기본적으로 리스트 형태이며 string 요소를 가지고 있다. (리스트의 각 string 요소들은 경로를 나타낸다.) 파이썬은 리스트안의 경로(string)를 하나씩 확인하면서 해당 경로에 import 하고자 하는 패키지가 있는지 확인한다.
sys
modules?sys
를 import 하면 파이썬은 제일 먼저 내장된 리스트를 찾아보고 그 안에 찾는 모듈이나 패키지가 있으면 다른 경로를 탐색하지 않고 import 한다. 내장되어있지 않은 다른 모듈을 import 할 때 파이썬은 내부의 sys.path를 찾아본다.
absolute path
와 relative path
의 차이점my_app/package2/subpackage1/module5.py (리눅스)
from . import class1
from .subpackage1.module5 import function2
.
은 import가 선언되는 파일의 현재 위치를 의미한다. 현재 위치를 기준으로 원하는 모듈의 경로를 설정하면 된다. (첫번째 줄 : 현재 위치한 파일에 있는 class1라는 클래스를 import )
(두번째 줄 : 현재위치의 하위 디렉토리인 subpackage1안의 module5에 있는 function2라는 함수를 import)
from ..module4 import class4
..
는 현재 위치에서 상위 디렉토리로 가는 경로로 위의 예를 보면, 현재위치의 상위 디렉토리인 module4 에 있는 class4를 import한다는 의미로 해석할 수 있다.
main.py에서 상대경로로 add_and_multiply 를 import 했을 때 발생하는 에러를 확인하고, main 모듈에서는 패키지의 모듈을 어떻게 import 해야 작동할까?
from .calculator.add_and_multiply import add_and_multiply
#ImportError: attempted relative import with no known parent package
상대경로를 이용한 import는 현재 모듈의 이름을 기준으로 한다. 메인 모듈의 이름이 항상 "__main__"
이기 때문에, 파이썬 애플리케이션의 메인 모듈로 사용하는 모듈은 항상 절대경로를 이용해 import 한다.
현재, 내가 실행하고자 하는 스크립트에서 다른 패키지나 모듈을 import하기 위해서는 상대경로가 아닌 절대경로를 사용해야한다는 뜻이다.
예를 들어, main 모듈에서 1번 패키지를 import 하고 1번 패키지는 2번 패키지를 import 한다고 했을 때, main 모듈은 절대경로를 사용해야하지만 중간 경로에서 import하는 1번 패키지는 상대경로를 사용해도 된다.
main.py
파일에서 볼 수 있는
if __name__ == '__main__'
이 코드에 대해 간단히 설명하자면 파이썬은 스크립트가 실행되는 메인 모듈에서는 자동으로 __name__
의 값으로 __main__
을 입력한다는 뜻이다.이와 달리 import를 이용해 패키지(혹은 모듈)을 불러오면 __name__
에 모듈 이름이 입력된다.
참고 : 클릭
add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 import 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보자.
위의 4-1에서 설명했듯이 예의 1번 패키지가 add_and_multiply.py와 같다고 보면 중간경로에 위치한 파일이기때문에 메인 모듈에서 import할 때, add_and_multiply.py가 다른 패키지의 multiply함수를 불러오는 데 있어서 절대경로인지 상대경로인지는 상관이 없다.
__init.py
for?파이썬은 파일명이 __init__.py
인 파일을 통해 이 파일이 있는 디렉토리를 파이썬 package임을 인식하고 패키지 내부의 모듈을 검색한다.
파이썬은 __init__.py
파일을 통해 package 초기 설정을 가능하게 한다. Package 안에 __init__.py
파일이 있으면 package가 import 될 때 그 안의 코드들이 자동으로 실행된다.
__init__.py
파일을 통해 할 수 있는 것
- import할 때 경로의 총 길이 줄이기
- package에서 import 할 수 있는 변수, 함수, 클래스 제한하기
- 그 외 package가 import 될 때 꼭 먼저 실행되어야 하는 코드들