sys.modules
와 sys.path
의 차이점을 서술해 주세요.sys.modules
sys.path
sys
도 import
해야하는 모듈입니다. 파이썬은 sys
모듈의 위치를 어떻게 찾을 수 있을까요?- 'sys':<module'sys'(built-in)>
Absolute path
와 relative path
의 차이점을 서술해 주세요.absolute path는 모듈 및 패키지의 시작부터 끝까지 생략이나 축약되지 않고 명확히 명시된 경로를 뜻한다. 어디에서 쓰든 항상 같아서 사용하는데 헷갈리지 않다는 장점이 있다.
# pkg2/module5.py
# relative path를 적용하기전
from pkg1 import module1
from pkg1.module2 import func3
from pkg2 import module3
from pkg2.pkg4.module6 import func10
경로의 시작점은 해당 module및 패키지 있는 current directory(이 부분은 sys.path에 자동 등록 되어 있다)으로 하기 때문에 main.py가 아닌 어디에서 사용하던 항상 같은 방법으로 쓰면 된다.
# pkg2/module5.py
# relative path를 적용하기 전
from pkg1.module2 import func3
from pkg2 import module3
from pkg2.pkg4.module6 import func10
relative path는 최상위 경로가 아닌 현재 자기가 속한 경로를 기준으로 정의한다. 주로 local package안에서 다른 local package를 참조할 때 쓰인다.
# pkg2/module5.py
# relative path를 적용한 후
from ..module2 import func3
from . import module3
from .pkg4.module6 import func10
# pkg4/module6.py
from ..module5 import func_12
absolute path에 비해 간결해 지는 장점이 있지만 프로젝트가 커지고 복잡도가 높아질 수록 혼동이 될 수 있으며 만일 파일의 위치가 바뀌게 되면 그에 맞춰서 path도 재설정 해주어야 한다.
calculator
패키지 만들기# absoulte path
# from calculator.add_and_multiply import add_and_multiply
# relative path
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1, 2))
__init__.py
빈 파일이지만 package임을 알려주는 역할을 함.
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
def multiply(a,b):
return(a*b)
main.py
에서 상대경로로 add_and_mutiply
를 임포트 했을 때 발생하는 에러를 확인하고, 다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.main.py에서 add_and_mutiply를 상대경로로 임포트 했을 때 아래와 같은 에러가 발생한다.
ImportError: attempted relative import with no known parent package
에러 해결을 위해서는 직접 실행시키는 module에서의 import는 absolute path로 진행하면 된다
add_and_multiply.py
에서 multiply
함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.absolute path와 relative path 모두 실행이 되지 않고 오류 발생
절대경로는 패키지를 인식하지 못하고 상대경로는 알려진 부모패키지가 없이
상대경로 import를 실행한다는 오류가 출력된다.
main 모듈과의 차이점은 name 변수를 확인하는 조건문이 있어서
main 모듈을 실행할 때는 name 변수의 조건문이 이를 만족시켜 print 함수를 실행
add_and_multiply.py 모듈은 absolute path와 relative path 모두 정상적으로 작동이 가능하다.
__init__.py
파일의 역할에 대해서도 정리해서 블로깅 해주세요.__init__.py
파일은 해당 디렉터리가 패키지의 일부라는 것을 알려주는 역할을 한다.
그러나 python3.3 버전부터는 __init__.py
파일이 없어도 패키지로 인식한다.
하지만 하위 버전 호환을 위해 __init__.py
파일을 생성하는 것이 안전한 방법이다.
Python이 처음으로 package를 가져올 때 자동으로 디렉토리 안의 __init__.py
에 있는 모든 코드를 실행하게 되므로 package에 있는 파일들에게 필요한 상태를 초기화하기 하는 용도로 설정하여 사용가능하다
파일 내부에 all이라는 리스트를 사용하여 import *을 할 때 불러올 module을 설정하여 원하는 module만 불러올 수 있게 할 수 있다